MapperTask 使用逻辑切片的方式划分block,调用InputFormat中的算法进行划分,TextInputFormat默认按照128M进行划分(默认一个block至少有一片),每个分片以行首开头,以行尾结尾。
每个分片对应一个mapper读入数据后,调用mapper函数转换成(k,v)形式,然后按照分区排序,分批溢写到磁盘。
Shuffle 从map分区排序溢写到reduce拉取数据的过程称为shuffle。
每个mapTask都有一个缓存区域,当调用write方法时,数据先写入到缓存区域中,数据写满80%后会先进行分组排序然后溢写到磁盘,剩下的20%继续同步写入数据。
如果定义了combine方法,则这里会发生分组内的聚合。
一个mapTask最终会生成多个临时文件,最后将这些临时文件使用归并排序合并成一个大文件,并按照分区器规则维护一个索引文件,在合并过程中也可以发生分组内聚合。
reducerTask数量由用户设定,每个reducer对应一个分区数据。
reducer拉取分区数据到本地,一次性读入一组数据执行reduce方法,然后按照OutPutFormat的输出格式将最终结果输出到hdfs,每个reducer对应一个文件。