mapreduce的整体流程
-
输入:
-
输入文件会被切分成多个切片,每一个切片交给一个map task进程来读取,默认每个block对应一个切片。
-
默认的Textinputformat以行为单位进行读取,每行数据返回一个键值对,将行号为key,行文本作为value,交给map函数处理。
因为如果一个切片包含了多个block,会存在maptask读取数据跨网络传输,不利于数据本地化的实现。 -
map:
-
在每个maptask中,有一个map函数,基于每行数据得到的键值对进行处理,得到新的键值对,通过context.write方法会将k2 v2写入到环形缓冲区中。
-
有多少个key-value对,就调用多少次Map函数。
-
shuffle阶段
-
我们知道,每个maptask会将map阶段输出数据写入本机的环形缓冲区中,环形缓冲区中的数据进行溢写 排序 合并等操作形成临时文件传输给reduce端,最终交给reduce函数来处理。
-
shuffle阶段整体分为分区 排序 规约 分组 四个步骤,但是每个步骤并不是单独进行的。
-
分区:
将一个maptask的数据分成多个分区,每个分区对应一个reducetask。
对于自定义分区操作,会为每一个key生成一个分区编号,在排序的时候会先按照分区编号排序,再