学科分类
目录
Hadoop技术栈

Shuffle工作原理

Shuffle是MapReduce的核心,它用来确保每个reducer的输入都是按键排序的。它的性能高低直接决定了整个MapReduce程序的性能高低。接下来,通过一个图来描述shuffle过程,具体如图1所示。

img

​ 图1 shuffle过程

在图1中,map和reduce阶段都涉及到了shuffle机制,接下来,我们分别进行分析,具体如下:

1.Map阶段

(1)MapTask处理的结果会暂且放入一个内存缓冲区中(该缓冲区默认大小是100M),当缓冲区快要溢出时(默认达到缓冲区大小80%),会在本地文件系统创建一个溢出文件,将该缓冲区的数据写入这个文件。

(2)写入磁盘之前,线程会根据reduceTask的数量,将数据分区,一个Reduce任务对应一个分区的数据。这样做的目的是为了避免有些reduce任务分配到大量数据,而有些reduce任务分到很少的数据,甚至没有分到数据的尴尬局面。

(3)分完数据后,会对每个分区的数据进行排序,如果此时设置了Combiner,将排序后的结果进行combiner操作,这样做的目的是尽可能少的执行数据写入磁盘的操作。

(4)当map任务输出最后一个记录时,可能有很多溢出文件,这事需要将这些文件合并,合并的过程中会不断的进行排序和combine操作,其目的有两个:一是尽量减少每次写入磁盘的数据量;二是尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。

(5)将分区中的数据拷贝给对应的reduce任务。

2.Reduce 阶段

(1)Reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce阶段接收的数据量相当小,则直接存储在内存中,如果数据量超过了该缓冲区大小的一定比例,则对数据合并后溢写到磁盘中。

(2)随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。

(3)合并的过程中会产生许多的中间文件(写入磁盘了),但MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。

点击此处
隐藏目录