【MapReduce】之 流程叙述

MapReduce之Map

MapTask执行流程:

执行流程文字表述:
1、maptask调用FileInputFormat的createRecordReader读取分片数据。

2、每行数据读取一次,返回一个<k,v>,其中k是offset,v是这一行的内容。

3、将<k,v>交给maptask处理。

4、每对<k,v>调用一次map<k,v,context>方法,然后调用context.write(k,v)将数据写出。

5、写出的数据交给数据收集器OutPutCollector.collector()处理。

6、将数据写入环形缓冲区,并记录写入的起始偏移量和终止偏移量,环形缓冲区默认大小为100M。

7、默认写到80%的时候,要溢写到磁盘,溢写磁盘的过程中,数据继续写入剩余的20%。

8、溢写磁盘前要先进行分区然后分区内排序。

9、默认的分区是HashPartitioner,即key的hash % reudceNum。

10、默认的排序规则是key的字典顺序,使用的是快速排序的算法。如果有必要,可以在排序后,溢写前调用combine(功能类似于reduce)函数进行计算,来达到减少数据的目的。

11、溢写会形成多个文件,当溢写文件数量大于3时,可以再次调用combiner函数来减少数据,溢写文件数量小于3时,则不调用。在maptask读取完一个分片数据后,先将环形缓冲区数据刷写到磁盘。

12、将数据的多个溢写文件进行合并,分区内排序(归并排序)。

13、合并的最终溢写文件可以使用压缩技术来达到节省磁盘空间和减少向reduce阶段传输数据的目的。

MapReduce之Reduce

执行流程文字描述:
1、reduce阶段通过HTTP协议抓取属于自己分区的所有map的输出数据(默认线程数是5,可以并发抓取)。
2、如果数据量小,会将抓取到的数据存在内存中,若数据量大,当达到本地内存的阈值时,会进行溢写操作,溢写前会进行合并和排序,这个过程中如果你设置有Combiner,也是会启用的,之后写到磁盘中。
3、溢写文件可能会产生多个,因此在进入reduce之前会再次合并(合并因子是10),最后一次合并要满足10这个因子,同时输入给reduce函数,而不是产生合并文件。
4、按照key对数据进行分组
5、对每一组数据reducetask都会调用reduce<key,List,context>方法,进行聚合操作(人为设定聚合),之后在调用context.write(key,value)方法将结果写出。
6、driver类中调用FileOutPutFormat.set()可以设置输出路径,一般设置为hdfs上。

Shuffle阶段图示:

【MapReduce】之 流程叙述
下方图片来自:https://blog.csdn.net/u014374284/article/details/49205885
【MapReduce】之 流程叙述

shuffle即:map阶段的输出到reduce阶段的输入。

MapReduce详细图示

【MapReduce】之 流程叙述如有不妥之处评论修改!