MapReducer工作流程图:
MapReducer工作流程:
------------------------------------------------mapper的工作--------------------------------------------
1.mapper开始运行,调用InputFormat组件读取文件逻辑切片(逻辑切片不是block块,切片大小默认和block块大小相同 可以是block大小的110%)
2.经过inputformat组件处理后,文件以<k,v>的形式进入我们自定义的mapper逻辑,经过map逻辑处理
----------------------------------------------mapper shuffle------start---------------------------------
3.mapper逻辑中输出结果会调用OutPutCollector组件写入环形缓冲区。
4.环形缓冲区的存储达到默认阀值会调用Spliller组件将内容分区且排序(快排算法,外部排序算法)后溢写到磁盘文件中,mapper最后结果不满环形缓冲区也会溢写到磁盘。
5.mapper结束后磁盘中的结果小文件会合并(merge),产生大文件(分区且排序,归并算法)。
------------------------------------------------mapper shuffle—end---------------------------------
------------------------------------------------reducer shuffle—start--------------------------------
6.reducer shuffle启动后会到不同的map结果文件中拉取相同区号的结果文件,再合并这些来自不同map的结果文件,再将这些文件合并(归并算法),产生的大文件是分区且排序且分好组了的,分组调用默认的GroupingComparator组件。
7.reducer把拉取的所有map输出文件合并完成之后就会开始读取文件,将读入的内容以<k,v>的形式输入到我们用户自定义的reducer处理逻辑中。
------------------------------------------------reducer shuffle—end--------------------------------
------------------------------------------------reducer --阶段开始------------------------------------
8.自定义的reducer进行处理。
9.用户逻辑完成之后以<k,v>的形式调用OutPutFormat组件输出到hdfs文件系统中去保存。
总结 :
map shuffle 环形缓冲区(默认大小100M 阈值是80%) 合并 排序 分区 对map处理之后的数据再处理combiner中。
combiner : 在map端计算之后,子节点上还可以进行计算,这个计算叫combiner 。
Reducer shffule 在缓冲中合并排序 缓冲没有固定值 处理完成会提供给reducer。
splits : map端的输入单位,对应文件的block,如果最后一个block的大小小于blockSize的10%,把最后一个block合并到上一个,形成一个split。
map task : map端的计算是并行的,每一个并行任务交一个maptask。maptask的数量由split的数量决定。所以map的输出对应Task的数量。
reduce task : reduce端的task是以partition(分区)的个数决定。
【只有在指定分区个数 > 1的情况下会触发分区】,如果默认或分区个数是1,reduceTask的个数是1;如果分区大于1,也就是reduceTask的数量大于1,输出的文件个数会大于1。reduceTask的个数如果大于1,则一般应和patition的个数相同,reduce端的输出文件个数也和patition的个数相同。
mapreduce : 默认提供了一个分区类,HashPartitioner。