文章目录
- WritableComparable 排序
- 一、排序概述
- 1、排序分类
- 2、自定义排序
- (1)、原理分析
- 二、WritableComparable 排序案例(全排序)
- 1、需求
WritableComparable 排序
一、排序概述
排序是MapReduce框架中最重要的操作之一
MapTask和ReduceTask均会对数据按照key
进行排序,该操作属于Hadoop的默认行为,任何应用程序中的数据均会被排序,而不管逻辑上是否需要
默认排序是按照字典顺序排序
,且实现该排序的方法是快速排序
对于MapTask,它会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使用率达到一定阈值后,再对缓冲区的数据进行一次快速排序
,并将那些有效数据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序
对于ReduceTask,它从每个MapTask上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写到磁盘上,否则存储在内存中,如果磁盘上文件数目达到一定阈值,则进行一次归并排序,以生成一个更大文件;如果内存中文件大小或者数目超过一定阈值,则进行一次合并后将数据溢写到磁盘上,当所有数据拷贝完毕后,ReduceTask统一对内存和磁盘上的所有数据进行一次归并排序。
1、排序分类
(1) 部分排序
MapReduce根据输入记录的键对数据集排序,保证输出的每个文件内部有序。
(2) 全排序
最终输出结果只有一个文件,且文件内部有序
,实现方式是只设置一个ReduceTask。但该方法在处理大型文件时效率极低,因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行架构。
(3) 辅助排序:(GroupingComparator分组)
在Reduce端对key进行分组,应用于:在接收的key为bean对象时,想让一个或几个字段相同(全部字段比较不相同)的key进入到同一个reduce方法时,可以采用分组排序
(4) 二次排序
在自定义排序过程中,如果compareTo
中的判断条件为两个即二次排序,如果是三个条件则为三次排序,依次类推
2、自定义排序
(1)、原理分析
bean对象作为key传输
,需要实现WritableComparable
接口重写compareTo
方法,就可以实现排序
@Override
public int compareTo(FlowBean o){
int result;
//按照总流量大小,倒序排序
if(sumFlow>bean.getSumFlow){
result = -1;
}else if(sumFlow<bean.getSumFlow()){
result = 1;
}else{
result = 0;
}
return result;
}
二、WritableComparable 排序案例(全排序)
1、需求
根据上一个序列化案例的结果对总流量进行排序
期望得到的数据 是这样的总流量这个字段进行倒序排序
@Override
public int compareTo(FlowBean o){
//倒序排列,按照流量总量从大到小
return this.sumFlow > o.getSumFlow() ? -1:1;
}