SPARK里的shuffle

定义


  • shuffle中文一般称为 数据混洗
  • shuffle的官方定义是,它是spark的一种让数据重新分布以使得某些数据被放在同一分区里的一种机制。

例子


比如reduceByKey操作。
有时,同一个key的value并没有分布在同一个partition里,甚至没有分布在同一台机器里,而是存放在集群里的某一个其他地方。这时,Spark就会搜集所有的data,并把这些值集合在一起再进行reduce。这就是一次shuffle。
shuffle后,如果需要对数据进行排序等,也可以以下操作:

  • mapPartitions
  • repartitionAndSortWithinPartitions
  • sortBy

能引起shuffle的操作有:

  1. repartition and coalesce (repartion操作)
  2. groupByKey and reduceByKey (对Key操作)
  3. cogroup and join (join操作)

性能影响


  • shuffle操作涉及到网络传输数据,可能还有序列化的问题。它通过map来组织数据,通过reduce来聚集,(这里的mapreduce只是作为Hadoop的mapreduce意义的一种引申)
  • shuffle操作会占用堆内存,当内存不够用时,就会把数据放到磁盘上。
  • shuffle操作会在磁盘上产生大量的中间文件,这些文件只有在相关的RDD不再使用并被回收后,才会被删除。这样做的目的是多次shuffle的时候,不用重复进行计算。所以,长时间运行Spark的任务必定消耗巨大的磁盘空间。临时文件的目录可以通过spark.local.dir进行设置。

你可能感兴趣的:(SPARK,spark,shuffle)