大数据开发:MapReduce当中的排序详解
Hadoop MapReduce,作为大数据处理的第一代代表性框架,在大数据学习阶段,是必须要搞懂的,这对于后续的Spark计算框架的学习,也是有指导意义的。今天的大数据开发学习分享,我们就来讲讲MapReduce当中的排序。

MapReduce当中的排序
排序是MapReduce框架中最重要的操作之一。
MapTask和ReduceTask均会对数据按照key进行排序。该操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序,而不管逻辑上是否需要。
默认排序是按照字典顺序排序,且实现该排序的方法是快速排序。
对于MapTask,它会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使用率达到一定阈值后,再对缓冲区中的数据进行一次快速排序,并将这些有序数据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序。
对于ReduceTask,它从每个MapTask上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写磁盘上,否则存储在内存中。如果磁盘上文件数目达到一定阈值,则进行一次归并排序以生成一个更大文件;如果内存中文件大小或者数目超过一定阈值,则进行一次合并后将数据溢写到磁盘上。当所有数据拷贝完毕后,ReduceTask统一对内存和磁盘上的所有数据进行一次归并排序。
MapReduce各种排序的分类
1、部分排序
MapReduce根据输入记录的键对数据集排序。保证输出的每个文件内部有序。
2、全排序
最终输出结果只有一个文件,且文件内部有序。实现方式是只设置一个ReduceTask。但该方法在处理大型文件时效率极低,因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行架构。
3、辅助排序
在Reduce端对key进行分组。应用于:在接收的key为bean对象时,想让一个或几个字段相同(全部字段比较不相同)的key进入到同一个reduce方法时,可以采用分组排序。
4、二次排序
在自定义排序过程中,如果compareTo中的判断条件为两个即为二次排序。
MapReduce当中的combiner
combiner类本质也是reduce聚合,需要继承Reducer父类;
combine是运行在map端的,对map task的结果做聚合;而reduce是将来自不同的map task的数据做聚合;
combine可以减少map task落盘及向reduce task传输的数据量;
并非所有的MapReduce job都适用combine,无论适不适用combine,都不能对最终的结果造成影响;比如下边求平均值的例子,就不适合使用combine——
Mapper
3 5 7 ->(3+5+7)/3=5
2 6 ->(2+6)/2=4
Reducer
(3+5+7+2+6)/5=23/5 不等于 (5+4)/2=9/2
MapReduce当中的GroupingComparator分组
GroupingComparator是MapReduce当中reduce端的一个功能组件,主要的作用是决定哪些数据作为一组,调用一次reduce的逻辑,默认是每个不同的key,作为多个不同的组,每个组调用一次reduce逻辑,我们可以自定义GroupingComparator实现不同的key作为同一个组,调用一次reduce逻辑。
#### 分组排序步骤:
(1)自定义类继承WritableComparator
(2)重写compare()方法
@Override
public int compare(WritableComparable a, WritableComparable b) {
// 比较的业务逻辑
return result;
}
(3)创建一个构造将比较对象的类传给父类
protected OrderGroupingComparator() {
super(OrderBean.class, true);
}
关于大数据开发学习,MapReduce当中的排序,以上就为大家做了初步的讲解了。在现有的大数据学习体系当中,MapReduce依然值得重视,对于内部的实现细节,也建议大家多去理解透彻。