一个MapReduce作业由Map阶段和Reduce阶段两部分组成,这两阶段会对数据排序,从这个意义上说,MapReduce框架本质就是一个Distributed Sort。

在Map阶段,Map Task会在本地磁盘输出一个按照key排序(采用的是快速排序)的文件(中间可能产生多个文件,但最终会合并成一个),在Reduce阶段,每个ReduceTask会对收到的数据排序,这样数据便按照key分成了若干组,之后以组为单位交给reduce方法处理。

很多人的误解在Map阶段,如果不使用Combiner便不会排序,这是错误的,不管你用不用Combiner,MapTask均会对产生的数据排序(如果没有ReduceTask,则不会排序,实际上Map阶段的排序就是为了减轻Reduce端排序负载)。

由于这些排序是MapReduce自动完成的,用户无法控制,因此,在hadoop1.x中无法避免,也不可以关闭,但hadoop2.x是可以关闭的(将reducetask设置为0)。