Shuffle中的排序方式
第一种:自定义排序器,优先级最高
job.setSortComparatorClass(null);//自定义排序的方式
- 需求:将Wordcount的结果按照key降序排序
Shuffle过程中会调用Key的compara方法,默认对key升序
- 第一步:构建一个排序器【比较器】
- 无参构造:注册允许强转,构建示例
- 重写比较的方法
package bigdata.hanjiaxiaozhi.cn.mr.usersort;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
/**
* @ClassName UserSort
* @Description TODO 用于自定义的排序器:就是提供一个比较器的方法
* @Date 2020/6/1 10:22
* @Create By hanjiaxiaozhi
*/
public class UserSort extends WritableComparator {
/**
* 允许将WritableComparable类型强转为Text类型
* 注册
*/
public UserSort(){
super(Text.class,true);
}
/**
* 将两个WritableComparable的对象 进行比较
* @param a
* @param b
* @return
*/
@Override
public int compare(WritableComparable a, WritableComparable b) {
//将两个对象,转为我们需要比较的对象类型
Text o1 = (Text) a;
Text o2 = (Text) b;
//默认是升序,需求是降序
return -o1.compareTo(o2);
}
}
- 第二步:配置使用自定义的排序器
job.setSortComparatorClass(UserSort.class);//自定义排序的方式
第二种:调用类型自带的排序的方法,如果没有设置第一种,则使用第二种
comparaTo
详细参考自定义数据类型之方式二:构建一个JavaBean实现WritableComparable接口
程序中 :两个必须要有一个,用于Shuffle中的排序,如果两种都没有,就会抛出异常,就会报错,无法构建集合
两种干预Shuffle中排序的方式的应用场景
- 第一种:适合于Key是Hadoop提供的类型,不想用Hadoop提供的排序的方式
- 第二种:适合于自定义数据类型时,自己指定排序比较的方式