MapReduce的shuffle过程可细分为两个过程:
- Map端:
- 客户端提交Job任务后,经过一系列资源分配启动MapTask后,各个MapTask就会去HDFS通过InPutFormat拿到数据,进入MapTask任务。
- 数据经过MapTask后会先根据Partitioner进行分区。
- 数据经过分区后就会进入环形缓冲区,环形缓冲区大小默认为100M,也可以通过mapred-site.xml文件进行配置,当数据达到80%的时候,环形缓冲区的数据就会发生溢出,溢出的同时也会对key进行快速排序。
- 当所有的数据都溢出完之后,所有的溢出文件就会被合并成一个文件,在合并的同时,也会对key进行排序,算法采用归并排序,最后每个MapTask对应一个文件。
- Reduce端:
- ReduceTask启动之后,各个ReduceTask就会去各个MapTask处理完成之后的文件中拉取自己对应分区的数据,拉取回来的数据会先放到内存中,内存不够用的话就会放在磁盘。
- 当所有的数据都拉取回来后,就会把所有的文件进行合并,合并过程会对key就行排序,算法采用归并排序。
- 当所有数据都合并完就进入ReduceTask进行Reduce逻辑处理了,处理完之后就会调用OutPutFormat把结果写入文件。