1.思考
只要对hadoop
中mapreduce
的原理清楚的都熟知下面的整个流程运行原理,其中涉及到至少三次排序,分别是溢写快速排序,溢写归并排序,reduce
拉取归并排序,而且排序是默认的,即天然排序的,那么为什么要这么做的,设计原因是什么。先给个结论,为了整体更稳定,输出满足多数需求,前者体现在不是采用hashShuffle
而是sortShuffle
,后者体现在预计算,要知道排序后的数据,在后续数据使用时的会方便很多,比如体现索引的地方,如reduce
拉取数据时候。
2.MapReduce原理分析
在分析设计原因之前,先理解一下整个过程,在map
阶段,根据预先定义的partition
规则进行分区,map
首先将输出写到缓存中,当缓存内容达到阈值时,将结果spill
到硬盘,每一次spill
都会在硬盘产生一个spill
文件,因此一个map task可能会产生多个spill
文件,其中在每次spill
的时候会对key
进行排序。接下来进入shuffle
阶段,当map
写出最后一个输出,需要在map
端进行一次merge
操作,按照partition
和partition
内的key
进行归并排序(合并+排序),此时每个partition
内按照key
值整体有序。然后开始第二次merge
,这次是在reduce
端,在此期间数据在内存和磁盘上都有,其实这个阶段的merge
并不是严格意义上的排序,也是跟前面类似的合并+排序,只是将多个整体有序的文件merge
成一个大的文件,最终完成排序工作。分析完整个过程后,是不是觉得如果自己实现MapReduce
框架的话,考虑用HashMap
输出map内容即可。
2.1 MapTask运行机制详解
整个流程图如下: