8.4 Reduce Task内部实现

与Map Task一样,Reduce Task也分为四种,即Job-setup Task, Job-cleanup Task, Task-cleanup Task和Reduce Task。本节中重点介绍第四种——普通Reduce Task。

Reduce Task要从各个Map Task上读取一片数据,经排序后,以组为单位交给用户编写的reduce()函数处理,并将结果写到HDFS上。本节将深入剖析Reduce Task内部各个阶段的实现原理。

8.4.1 Reduce Task整体流程

Reduce Task的整体计算流程如图8-22所示,共分为5个阶段。

❑Shuffle阶段:也称为Copy阶段。Reduce Task从各个Map Task上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。

❑Merge阶段:在远程拷贝数据的同时,Reduce Task启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。

❑Sort阶段:按照MapReduce语义,用户编写的reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个Map Task已经实现对自己的处理结果进行了局部排序,因此,Reduce Task只需对所有数据进行一次归并排序即可。

❑Reduce阶段:在该阶段中,Reduce Task将每组数据依次交给用户编写的reduce()函数处理。

❑Write阶段:reduce()函数将计算结果写到HDFS上。

在接下来几小节中,我们将详细介绍Shuffle、Merge、Sort和Reduce四个阶段。考虑到Write阶段比较简单,我们不再介绍。

8.4 Reduce Task内部实现 - 图1

图 8-22 Map Task计算流程