整体架构图:
inputformat:主要用于描述输入数据的格式,其按照某个策略将输入数据切分成若干个split,并为mapper提供输入数据,将split解析成一个key/value对。
mapper:将split传入的keyvalue对进行处理,产生新的keyvalue (k1,v1)-》(k2,v2)
partitioner:作用是对mapper产生的中间结果进行分区,以便将key有耦合关系的数据交给同一个reducer处理,它直接影响reducer阶段的负载均衡。
reducer:以map的输出作为输入,对其进行排序和分组,再进行处理产生新的数据集,即reducer (k2,list(v2))->(k3,v3)
outputformat:主要用于描述输出数据的格式。
map处理阶段:
1)read阶段:MapTask通过用户编写的RecorderReader,从输入InputSplit中解析出一个个key/value.
2)Map阶段:将解析出的key/value交给用户编写的Map函数处理,并产生一系列新的key/value.
3)collect阶段:map函数生成的kv通过调用partitioner进行分片,并写入一个环形内存缓冲区中。
4)split阶段,即溢写,当环形缓冲区满后,mr会将数据写到本地磁盘上,形成一个临时文件。
5)combine阶段:所有数据处理完后,maptask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。
reducetask阶段
1)shuffle 阶段:Reduce Task从各个maptask上远程拷贝一片数据,并针对某一片数据,大小超过一定阈值则写到磁盘,否则直接放到内存中。
2)merge阶段:在远程拷贝数据的同时,reducetask启动了3个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上的文件过多。
3)sort阶段:采用了基于排序的策略将key相同的数据聚在一起,由于各个maptask已经实现了对自己的处理结构进行了局部排序,因此reducetask只需对所有数据进行一次归并排序。
4)reduce阶段:将每组数据依次交给用户编写的reduce函数处理。
5)write阶段:reduce函数将计算结构写到hdfs上。
网友评论