今天学习 Spark Shuffle。昨天文章提到了 Spark 划分 stage 时,分为了 ShuffleMapStage 和 ResultStage。没看过的可以看昨天的文章。
在划分 stage 时:
- 前面的所有 stage 被称为 ShuffleMapStage。ShuffleMapStage 的结束伴随着 shuffle 文件的写磁盘。
- 最后一个 stage 称为 finalStage,它本质上是一个 ResultStage 对象,ResultStage 对应代码中的 action 算子,将一个函数应用在 RDD 的各个 partition 的数据集上,意味着一个 job 的运行结束。
下面讲 Spark 的两种 Shuffle。
1.HashShuffle
1.1 未优化的 HashShuffle
假设每个 Executor 只有 1 个 CPU core,无论这个 Executor上分配多少个 Task 线程,同一时间都只能执行一个 Task 线程。例如 3 个 Reducer,具体过程如下:
- 在 Task 中进行 Hash 计算,分区器计算分区(hash 值 % num_reduce,这里是 3),得到 3 个不同的分区(