Spark的4种shuffle

424 阅读2分钟

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-value
    

    2、不带聚合操作: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过程中的多种不同技术实现做了一个排列组合)