1、Spark1.2以前的HashShuffleManager
-
1、未经优化的HashShuffleManager
上游的task数量:m
下游的task数量:n
上游的executor总数:k
总共磁盘文件个数:m * n (上游的task数量 * 下游的task数量) -
2、优化了的HashShuffleManager
上游的task数量:m
下游的task数量:n
上游的executor总数:k
总共磁盘文件个数:k * n
2、Spark1.2开始的SortShuffleManager
SortShuffleManager的运行机制主要分成两种,一种是普通运行机制,另一种是bypass运行机制。当shuffle read task的数量小于等于spark.shuffle.sort.bypassMergeThreshold参数的值时(默认为200),就会启用bypass机制
shuffle write----mapper阶段----上一个stage的最后结果写出
shuffle read-----reduce阶段-- --下一个stage拉取上一个stage进行合并
-
1、普通机制
需要关注的有两点:
1、写出数据
2、要排序shuffle类型的算子有两种:
1、带聚合操作:reduceByKey底层数据结构:map key-value2、不带聚合操作:Join coGroup
底层数据结构:array -
2、bypass机制
当shuffle read task数量:< spark.shuffle.sort.bypassMergeThreshold就会触发bypass机制1、不排序
2、写出数据的方式不一样
3、真实的业务场景
如果数据需要排序,使用哪种Shuffle? ------->SortShuffle的普通机制
这四种shuffle没有哪种是绝对的完美,都在不同的场景中有不同的选用标准
MapReduce的shuffle是一种通用的shuffle(每一个task最终都只会形成一个磁盘文件加一个索引文件,而且还会给我们进行排序)
Spark的4中shuffle就是在MapReduce的shuffle基础之上,进行了某些动作的删减之后形成的一个特例实现
Spark提供了多种shuffle方案供使用者去现则
MapReduce Shuffle的三个组件:Partitioner、combiner、sort
Spark:可以在四种方案中选择使用其中哪一种(就是对上面的MapReduceShuffle过程中的多种不同技术实现做了一个排列组合)