一、Shuffle详解
### --- shuffle详解
~~~ 在 Spark 或 MapReduce 分布式计算框架中,数据被分成一块一块的分区,
~~~ 分布在集群中各节点上,每个计算任务一次处理一个分区,
~~~ 当需要对具有某种共同特征的一类数据进行计算时,就需要将集群中的这类数据汇聚到同一节点。
~~~ 这个按照一定的规则对数据重新分区的过程就是Shuffle。
二、Spark Shuffle的两个阶段
### --- Spark Shuffle的两个阶段
~~~ 对于Spark来讲,一些Transformation或Action算子会让RDD产生宽依赖,
~~~ 即Parent RDD中的每个Partition被childRDD中的多个Partition使用,这时需要进行Shuffle,
~~~ 根据Record的key对parent RDD进行重新分区。
~~~ 以Shuffle为边界,Spark将一个Job划分为不同的Stage。
~~~ Spark的Shuffle分为Write和Read两个阶段,分属于两个不同的Stage,
~~~ 前者是Parent Stage的最后一步,后者是Child Stage的第一步。
三、Spark Shuffle执行流程图
![](https://i-blog.csdnimg.cn/blog_migrate/b57293f965025e9622184cdfb4a497ed.png)
### --- Spark 的 Stage 分为两种:
~~~ ResultStage。负责返回计算结果
~~~ ShuffleMapStage。其他的均为ShuffleMapStage
### --- 如果按照 map 端和 reduce 端来分析的话:
~~~ ShuffleMapStage可以即是map端任务,又是reduce端任务
~~~ ResultStage只能充当reduce端任务
### --- Spark Shuffle的流程简单抽象为以下几步:
~~~ Shuffle Write
~~~ Map side combine (if needed)
~~~ Write to local output file
~~~ Shuffle Read
~~~ Block fetch
~~~ Reduce side combine
~~~ Sort (if needed)
四、Spark Shuffle技术演进
### --- 在Spark Shuffle的实现上,经历了Hash、Sort、Tungsten-Sort三阶段:
~~~ Spark 0.8及以前 Hash Based Shuffle
~~~ Spark 0.8.1 为Hash Based Shuffle引入File Consolidation机制
~~~ Spark 0.9 引入ExternalAppendOnlyMap
~~~ Spark 1.1 引入Sort Based Shuffle,但默认仍为Hash Based Shuffle
~~~ Spark 1.2 默认的Shuffle方式改为Sort Based Shuffle
~~~ Spark 1.4 引入Tungsten-Sort Based Shuffle
~~~ Spark 1.6 Tungsten-sort并入Sort Based Shuffle
~~~ Spark 2.0 Hash Based Shuffle退出历史舞台
### --- 简单的说:
~~~ Spark 1.1 以前是Hash Shuffle
~~~ Spark 1.1 引入了Sort Shuffle
~~~ Spark 1.6 将Tungsten-sort并入Sort Shuffle(利用对外内存进行排序)
~~~ Spark 2.0 Hash Shuffle退出历史舞台