MapReduce的shuffle过程





对于大数据计算框架而言,Shuffle阶段的设计优劣势决定性能好坏的关键因素之一。

shuffle的优化是一个不断发展的过程。


官方图




shuffle在map到reduce的过程:


Map:


Input Split —>  map  —>  buffer in memory  —>  partition  —>  sort  —>  group  —>  combine  —>  spill to disk  —>   merge spill files on disk  



1. Input Split分配给Map  一个分片默认对应一个map


2. Map过程处理,Mapper任务会接收输入分片,有多少个分片map就被调用多少次(并行处理),对记录进行处理。转换成新的<key,value>输出。


3. Map输出结果缓存在内存中。


4. 内存中进行重新Partition,默认是HashPartitioner(采用曲摸hash (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks),目的是将map结果分配到不同的reducer,有几个Partition就有几个Reducer。


5. 内存中Partition结束后,每个分区的数据,会按照key进行排序,同时必须实现WritableComparable接口。


6. 对于排序后的<key,value>,会按照key进行分组。相同key的<key,value>数据被分配到同一组。


7. 排序分组后,相同的key组成了一个列表,如果设置了combiner,会本地合并数据,减少网络IO


8. 当内存中buffer(default 512M)达到阀值(default 80%),就会把记录spill(溢写)到磁盘中。优化Map时可以调大buffer的阀值,缓存更多的数据。


9. 当磁盘中的spill的文件数目比规定的文件数目多时,会多次调用combiner。


10. Map结束后会把spill出来的多个文件合并成一个,merge过程最多10个文件同时merge成一个文件,多余的文件分多次merge,merge过程时merge sort算法。


11.Map端shuffle完毕,数据都有序的放在磁盘里,等待reducer抓取数据。



Reduce:


1. Copy phase:


reduce的后台进程(default 5个)被Application Master指定的机器上将map输出数据拷贝到本地。先拷贝到内存,内存满了拷贝到磁盘。


2. Sort phase (Merge phase):


reduce 采用merge sort,将来自各个map的data进行merge,merge成有序的更大的文件。


3. 如果设置了combiner,merge过程可能会调用Combiner。是否调用要看磁盘中产生的文件数据是否超过了设定的阀值。


4. Reduce phase:


reduce job 开始,输入时shuffle sort 过程merge产生的文件。














猜你喜欢

转载自blog.csdn.net/dream__sky_/article/details/79864658
今日推荐