关于hadoop 的shuffle 过程理解(面试题系列~~~)
MapReduce 确保每个reducer 的输入都是按键进行排序的。系统执行排序,将map 输出作为输入传给reducer 的过程称为shuffle。
map 端的shuffle 过程
写入磁盘
map 端会先将输出写入到内存缓冲区,当内存缓冲区到达指定的阈值时,一个后台线程就开始将缓冲区的内容spill 到磁盘。
分区&排序
在写入磁盘之前,线程首先根据数据最终要到达的reducer 将数据划分为相应的分区。在每个分区中,后台线程按键进行内存中排序。(分区的目的是将数据划分到不同的Reducer 上去,以期望达到负载均衡)
合并阶段
每个map 任务可能产生多个spill 文件,在任务完成之前,spill 文件会被合并为一个已分区已排序的输出文件。
reduce 端的shuffle 过程
复制阶段
每个reduce 任务需要若干个map 任务的输出作为输入,每个map 任务的完成时间可能不同,因此在每个任务完成时,reduce 任务就开始复制其输出。
这就是reduce 任务的复制阶段。reduce 任务有少量的复制线程,因此能够并行取得map 输出。
合并阶段
复制完所有map 输出后,reduce 任务进入合并阶段。这个阶段将合并map 输出,并维持其顺序排序。最后将合并结果数据直接输入reduce 函数。