spark shuffle

spark的shuffle来自于宽依赖的算子,也就是父RDD的一个分区的数据要发送给子RDD的多个分区,本质是数据跨节点的移动,所以特别消耗性能。

 

spark1.6.3之前是hash  shuffle,

优点

  1. 快-不需要排序,也不需要维持hash表
  2. 不需要额外空间用作排序
  3. 不需要额外IO-数据写入磁盘只需一次,读取也只需一次

缺点

 

  生成中间结果文件数太大(每个map任务输出R个文件),若M个map,R个reduce,中间结果文件为M*R个

  大量的文件写入,使文件系统开始变为随机写,性能比顺序写要降低100倍

  缓冲区占用内存空间过大,单节点在执行 Shuffle 任务时缓存区大小消耗为 (Shuffle 任务数m) * R * spark.shuffle.file.buffer.kb

 

spark 2.X都是Sort-based shuffle

  每个 Map 任务会最后只会输出两个文件(其中一个是索引文件,记录每个分区的偏移量)

  Shuffle 产生的中间结果文件数为 2 * M(M 为 Map 任务数)

  优缺点:中间文件少了,但是多了个排序的步骤

 

Bypass Sort-based Shuffle

  当 Reduce 任务小于 spark.shuffle.sort.bypassMergeThreshold 配置(默认 200)时,Spark Shuffle 开始按照 Hash Shuffle 的方式处理数据,而不用进行归并排序,只是在 Shuffle Write 步骤的最后,将其合并为 1 个文件,并生成索引文件。这样实际上还是会生成大量的中间文件,只是最后合并为 1 个文件并省去排序所带来的开销

 

参考:

  https://zhuanlan.zhihu.com/p/67061627

posted @ 2020-07-19 16:08  认知源码  阅读(181)  评论(0)    收藏  举报