Hadoop大数据开发

大数据开发:MapReduce当中的排序详解

2021-06-25  本文已影响0人  成都加米谷大数据

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依然值得重视,对于内部的实现细节,也建议大家多去理解透彻。

上一篇 下一篇

猜你喜欢

热点阅读