mepreduce共三个模块,map、shuffle、reduce。map端读取数据并将数据映射为键值对发送给ruduce端,在发送过程中会进过一个shuffle过程(分区、排序、分组),数据先按分区规则进行分区,分区后再对每个分区中的数据进行排序,最后再对排序后的数据进行分组(相同key的为一组)。经过shuffle之后,数据已经分为了不同的区,每个区中的数据已经排好序传入reduce端,reduce端每次读入一个组的数据进行处理。
一、排序
shuffle过程中会对数据进行一次排序,方便后面的分组。默认排序规则是字典顺序,当map端发送的key是自定义类型时,由于shuffle是按照key进行排序,所以自定义类型需要指定排序规则。
二次排序:在实际的业务中时常也有排序的需求,此时可利用shuffle过程中的排序对业务数据进行排序。
步骤:
1. 实现WriableCompareble接口
2. 实现compareTo() 方法
// 泛型传入要比较的类型
static class FlowBean implements WritableComparable<FlowBean>{
private String upFlow;
private String downFlow;
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeUTF(upFlow);
dataOutput.writeUTF(downFlow);
}
public void readFields(DataInput dataInput) throws