Spark的Shuffle机制

1. 相关概念

在Spark程序中,Stage按照阶段的不同划分为ShuffleMapStage&ResultStage;
按照Stage的不同,里面的Task分为ShuffleMapTask&ResultTask;
而ShuffleMapTask中是会伴随着磁盘IO的,有ShuffleWriter&ShuffleReader。
Shuffle也分为HashShuffle(1.6版本之前)&SortShuffle两大类。

2. HashShuffle

2.1 未优化的HashShuffle

在这里插入图片描述
缺点:
(1)map 任务的中间结果首先存入内存(缓存), 然后才写入磁盘. 这对于内存的开销很大, 当一个节点上 map 任务的输出结果集很大时, 很容易导致内存紧张, 发生 OOM
(2)生成很多的小文件. 假设有 M 个 MapTask, 有 N 个 ReduceTask, 则会创建 M * n 个小文件, 磁盘 I/O 将成为性能瓶颈.

2.2 优化后的HashShuffle

在这里插入图片描述
复用Buffer,小文件的数量明显减少。

3. SortShuffle

3.1 普通的SortShuffle

在这里插入图片描述
数据会先写到数据结构中;默认达到10000条数据就会发生溢写;在溢写之前会对数据进行排序;最后会有一个merge阶段将所有的磁盘文件合并成一个数据文件;同时创建索引文件方便reducetask查找。
缺点:排序会消耗CPU性能。

3.2 BypassSortShuffle

bypass运行机制的触发条件如下(必须同时满足):
(1)shuffle map task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值,默认为200。
(2)不是聚合类的shuffle算子(没有预聚合)(比如groupByKey)。
在这里插入图片描述 在数据量比较小的情况下,可以跳过排序,节约CPU消耗。