MapReduce 之 Shuffle 的详细流程

主要流程简介:

先对数据进行切片,然后将数据传递给map,map的输出是内存缓冲区(圆形缓冲区),内存缓冲

区默认大小是100M,当达到80%的时候将数据溢写到本地,剩余20%用于继续获取数据,在溢写

到磁盘的时候会执行parti tion(分区) 和 sort (排序), 然后对文件进行合并操作,合并完成之后 reduceTask 会去启动线程去mapTask拉取数据,然后进行文件合并,并进行排序(归并),然后将

小文件合并成一个大文件并调用reduce方法完成最终输出效果。

PS:合并操作有三种方式:

1. 内存到 内存

2.内存到 本地

3.本地到 本地

扫描二维码关注公众号,回复: 3941170 查看本文章

详细流程:

1. input Split 分配 给Map

2. Map过程进行处理,Mapper任务会接收输入的分片,然后不断调用map方法,对记录进行处理,处理完毕之后。转换为新的<key,value>输出(其中每一个分片对应一个map,一个map可以调用多次来处理分片)

3.、Map的输出结果会缓存到内存里,当内存中的buffer in memory当达到阈(yu)值 默认的80%, 就会把记录溢写到磁盘文件中,然后用剩余的20%来继续接受数据。

Ps:优化map时可以调大buffer的阈值,缓存更多的数据

4.内存中进行Partition (分区),默认是HashParti tion

Ps: 此hash 采用 hash( key.hashcode () ) & integer.MAX_value) % munReduceTasks 有多少个就会有多少个 ReduceTask

5.内存中 partition 结束之后,对于不同分区数据,会按照key进行排序,这里key必须实现writableComparable接口,该类实现了Comparable,才可以进行比较排序。

6. 对于排序之后的<key,value>会按照key进行分组,如果key相同,name相同key的<key,value>就会

被分到一个组中,最终,每个分组会调用一次reduce 方法。

7.排序分组结束之后,相同的key就在一起组成了一个类表,如果设置过Combiner,就合并数据,减少写入磁盘

Ps::combiner本质就是一个reducer

8.当磁盘中的spill文件数目比规定的文件数据多的时候,会多次调用combiner,在不影响结果的前提下,combiner可以被调用多次。

9.Map结束的时候会把spill出来的多个文件合并成一个,merge过程最多10个文件同时合并成一个文件,多余的文件就多次就会调用merge

10.Map端的shuffle完毕,数据都有序的存放到磁盘中,等待reducer来获取

ReduceTask

1.reducer 的后台会被APPMaster指定的机器上将map和output拷贝到本地,先拷贝到内存,内存满了就拷贝到磁盘

2.Reducer采用merge Sort将来自各个map的数据进行merge,merge成一个有序的更大文件

3.reduce 端job 开始,输入的是shuffle Sort 过程所产生的文件

4.reducer的输入文件,不断的merge后,他们会出现最终文件。这个最终文件可能存储在磁盘也可能存储到内存。reduce方法就是制动执行当前这个文件的处理最终该处理结果放到HDFS上。

猜你喜欢

转载自blog.csdn.net/mswuxianshen/article/details/83621663