spark shuffle
spark的shuffle来自于宽依赖的算子,也就是父RDD的一个分区的数据要发送给子RDD的多个分区,本质是数据跨节点的移动,所以特别消耗性能。
spark1.6.3之前是hash shuffle,
优点
- 快-不需要排序,也不需要维持hash表
- 不需要额外空间用作排序
- 不需要额外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 个文件并省去排序所带来的开销
参考:

浙公网安备 33010602011771号