先对数据进行切片,然后将数据传递给map,map的输出是内存缓冲区(圆形缓冲区),内存缓冲
区默认大小是100M,当达到80%的时候将数据溢写到本地,剩余20%用于继续获取数据,在溢写
到磁盘的时候会执行parti tion(分区) 和 sort (排序), 然后对文件进行合并操作,合并完成之后 reduceTask 会去启动线程去mapTask拉取数据,然后进行文件合并,并进行排序(归并),然后将
小文件合并成一个大文件并调用reduce方法完成最终输出效果。
PS:合并操作有三种方式:
1. 内存到 内存
2.内存到 本地
3.本地到 本地
详细流程:
1. input Split 分配 给Map
2. Map过程进行处理,Mapper任务会接收输入的分片,然后不断调用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. 对于排序之后的
被分到一个组中,最终,每个分组会调用一次reduce 方法。
7.排序分组结束之后,相同的key就在一起组成了一个类表,如果设置过Combiner,就合并数据,减少写入磁盘
Ps::combiner本质就是一个reducer
8.当磁盘中的spill文件数目比规定的文件数据多的时候,会多次调用combiner,在不影响结果的前提下,combiner可以被调用多次。
9.Map结束的时候会把spill出来的多个文件合并成一个,merge过程最多10个文件同时合并成一个文件,多余的文件就多次就会调用merge
10.Map端的shuffle完毕,数据都有序的存放到磁盘中,等待reducer来获取
1.reducer 的后台会被APPMaster指定的机器上将map和output拷贝到本地,先拷贝到内存,内存满了就拷贝到磁盘
2.Reducer采用merge Sort将来自各个map的数据进行merge,merge成一个有序的更大文件
3.reduce 端job 开始,输入的是shuffle Sort 过程所产生的文件
4.reducer的输入文件,不断的merge后,他们会出现最终文件。这个最终文件可能存储在磁盘也可能存储到内存。reduce方法就是制动执行当前这个文件的处理最终该处理结果放到HDFS上。
、