MapReduce 工作流程详解
一、MapTask 的工作机制
总体可概括为如下流程:
1、client 向集群提交任务,指定了分片个数 n
2、集群启动 n 个 maptask
3、maptask 通过 RecordReader 读取数据(k,v),v 代表一行一行的数据
4、读到数据后 mapper 对一行一行的数据进行逻辑处理
5、把处理后的数据分装成新的 (k1, v1),通过 Context.write 发送到环形缓冲区
6、环形缓冲区把数据写入不同的分区,并且在区内针对 key 进行排序
7、当环形缓冲区达到 80% ,就把缓冲区内的数据溢出到文件,文件也是分区且区内有序
8、把之前每个分区对应的文件进行合并,新的文件也是分区且区内有序
二、ReduceTask 的工作机制
总体可概括为如下流程
1、根据分区号把 MapTask 最后合并好的文件按照分区抓取过来
2、对把抓取过来的文件合并在一起,并按照 key 排序
3、对排好序的数据进行逻辑运算生成新的 (k, v)
4、输出结果
注意:
环形缓冲区的大小会影响到 MapReduce 的执行效率,因为缓冲区越大,磁盘 io 的次数就越少,执行速度就越快。
三、Shuffle 的工作机制
在 MapTask 中 map 方法之后,ReduceTask 方法中 reduce 之前的操作称为 shuffle,所以 shuffle 就是 MapReduce 的核心操作了。