目录
排序是MapReduce框架中最重要的操作之一。MapTask和ReduceTask均会对数据Key进行排序,该操作是Hadoop的默认行为。不管逻辑是否需要,MapReduce程序中的Key值都会进行排序。
一、MapReduce中的排序
MapReduce程序中都有哪些排序呢?下图为Mapreduce程序的执行流程图。如图所示,内部排序分为Mapper端的快速排序和归并排序,以及Reducer端的归并排序。
二、问题的引入
如上分析可知,排序在Mapper端和Reducer端都会执行。那么既然要排序,就需要Key类对象之间能够比较,那么MapReduce程序中Key类的比较器是如何获得的呢?
总体来说Key类的比较器的获取可以用下图表示,以阶段1、阶段2、阶段3三个阶段划分并在源码解析中解释。
三、源码解析
MapTask在创建缓冲区时,会获取Key的比较器对象,源代码①为MapperTask内部类OutputBuffer的init方法。
//源码①
comparator = job.getOutputKeyComparator();
上述的方法会调用到Jobconf类,试图从该类中获得比较器。源码②如下:
//源码②
public RawComparator getOutputKeyComparator() {
Class&