【大数据哔哔集】是小编发起的每日大数据圈子了最高频、时尚、前沿的面试题目以及资讯等,欢迎您关注。
首先,我们祭出两张经典的图:
上图表示MapReduce的shuffle执行过程。
在MapReduce的shuffle过程中执行了三次排序,分别是:
此外,在MapReduce整个过程中,默认是会对输出的KV对按照key进行排序的,而且是使用快速排序。
具体的流程如下:
那么,什么是二次排序呢?
假设有如下一组数据:
1 1
3 3
2 2
1 5
1 3
2 1
现在需要 MapReduce 程序先对其第一个字段排序,再对第二个字段进行排序。最终会得到如下结果:
1 1
1 3
1 5
2 1
2 2
3 3
我们在根据key进行排序时,如果key是一个复合对象,即该对象中包含多个成员属性,那么在进行key比较时,就会涉及到多个属性间的比较,而如果compareTo() 方法中,比较条件为两个的话,这就是所谓的二次排序。
辅助排序也叫分组排序,是指在reduce前的group过程中根据排序规则进行的分组,因为分组的时候是需要比较KV中key是否相同,如果相同才会归为同一个组,如果不相等,就归为不同的组,所以就涉及到key比较方法了。总的来说其实定义key在什么情况下才相等。这个过程可以自己定义分组的方法,也就是分组排序的实现类。
使用方法:
1、自定义分组类,继承 WritableComparator
2、调用父类的构造方法,创建实例
3、重写父类的 compare方法
一个经典的辅助排序的案例如下:
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
public class OrderGroupingComparator extends WritableComparator {
protected OrderGroupingComparator() {
super(OrderBean.class, true);
}
@SuppressWarnings("rawtypes")
@Override
public int compare(WritableComparable a, WritableComparable b) {
OrderBean aBean = (OrderBean) a;
OrderBean bBean = (OrderBean) b;
int result;
if (aBean.getOrder_id() > bBean.getOrder_id()) {
result = 1;
} else if (aBean.getOrder_id() < bBean.getOrder_id()) {
result = -1;
} else {
result = 0;
}
return result;
}
}
编写好自定义的排序类之后,需要在job中指定好自定义的分组类:job.setGroupingComparatorClass(OrderGroupCompartor.class);
这样,我们就可以使用辅助排序了。
好了,到此 Hadoop 中的排序你清楚了吗?
版权声明:
本文为《大数据真好玩》原创整理,转载需作者授权。未经作者允许转载追究侵权责任。
责编 | 大数据真好玩
插画 | 大数据真好玩
微信公众号 | 大数据真好玩