1. 前言
让我们先来回忆一下MapReduce 的 shuffle 过程。
在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段通过shuffle读取数据并输出到对应的Reduce;而Reduce阶段负责从Map端拉取数据并进行计算。在整个shuffle过程中,往往伴随着大量的磁盘和网络I/O。所以shuffle性能的高低也直接决定了整个程序的性能高低。
下面是 MapReduce 的 shuffle 过程,数据被拉取到不同的节点上进行聚合处理,会产生大量的磁盘和网络IO。
Spark 也有自己的 shuffle 过程。下图是 DAG schedula的任务划分,从最后一个RDD往前追溯,遇到宽依赖(shuffle)就划分一个 Stage。
在DAG 调度的过程中,在划分 Stage 的时候,构建 shuffleDependency 的时候进行shuffle注册,获取后续数据读取所有要的 shuffleHandle, 最终每一个 job 提交之后都会生成一个 ResultStage 和若干个 ShuffleMapStage ,其中 ResultStage 表示生成作业的最终结果所在的 Stage, ResultStage 与 shuffleMapS