总流程
1.首先启动MRAppMaster,根据job的描述信息,计算所需要的maptask的数量,向集群请求启动maptask
2. 通过定义的map()方法将数据处理成
mapTask
maptask的数量默认是由待处理数据的逻辑切片决定,每个逻辑切片对应一个maptask。
切片的大小默认等于block的大小,切片的时候部考虑数据整体,而是分别对每一个文件进行单独的切片。例如
文件1 大小为100M
文件2 大小为1M
默认的block大小为60M
最后的切片结果为
切片1 大小为60M
切片2 大小为40M
切片3 大小为1M
FileInputFormat中,计算切片大小的逻辑:Math.max(minSize, Math.min(maxSize, blockSize))
maxsize(切片最大值):
参数如果调得比blocksize小,则会让切片变小,而且就等于配置的这个参数的值
minsize (切片最小值):
参数调的比blockSize大,则可以让切片变得比blocksize还大
另外还可以通过设置参数mapred.map.tasks来设置程序员期望的map个数,这个数字只有在大于default_num的时候才会生效
reducetask
与maptask的并发数由切片数决定不同,Reducetask数量可以直接手动设置
如果计算全局的汇总结果则只能有一个reducetask
如果map()阶段最终的结果分类与reducetask个数相同则每个reducetask对应一个分类
如果map()阶段最终结果分类小于reducetask个数,则多余的reducetask产生空文件
如果map()阶段最终而就够分类大于reducetask个数,默认情况下是按hashcode与reducetask个数取余进行分配
shuffle
map阶段处理的数据如何传递给reduce阶段,这个流程就叫做shuffle
1. maptask收集我们的map()方法输出的kv对,放到内存缓冲区中
2. reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据
3. reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序)
4. 合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程
combiner
combiner组件的父类就是Reducer, combiner和reducer的区别在于运行的位置:Combiner是在每一个maptask所在的节点运行,Reducer是接收全局所有Mapper的输出结果;
combiner对每一个maptask的输出进行局部汇总,以减小网络传输量