MapReduce的详细运行阶段

MapReduce的详细运行阶段①②③④
map task读文件,通过TextInputFormat读文本切片,一次读一行,返回(key,value);


上一步获取的(key,value)键值对经过map方法逻辑处理成新的(key,value)键值对,通过context.write输出到OutputCollectior收集器

shuffle阶段

OutputCollectior把手机的(key,value)键值对写入到环形缓冲区中,环形缓冲区默认大小为100M,当写到80%时就会触发spill溢写


在溢写之前会对数据进行分区和排序,会对环形缓冲区里面的每个(key,value)键值对hash一个partition值,相同partition值为同一分区,并按照key排序(快排)


将环形缓冲区排序后的内存数据不断溢写都本地磁盘,如果map阶段处理的数据较大,可能会溢写多个文件
(80M 一个块默认128M 正常溢写两个文件 但逻辑块可能大于128M 造成溢写超过两个)


多个溢写的文件被merge合并成大文件(归并排序),此时map task最终结果文件是分区且区内有序


reduce task根据自己的分区号,去各个map task节点拷贝相同partition的数据到reduce task本地磁盘工作目录

①①
reduce task 会把同一分区的来自不同map task的结果文件,再进行merge合并成一个大文件(归并排序),大文件内容按照k有序排列

shuffle阶段结束

①② ①③
进入reduce task的逻辑运算过程,首先调用GroupingComparator对大文件的数组进行分组,从文件中每次取出一组(k,value)键值对,调用用户自定义reduce()方法进行逻辑处理

①④ ①⑤
通过OutPutFormat方法将结果数据写到hdfs part-r-000*文件中