①②③④
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*文件中