- 因为map、reduce 之间传递的参数是通过本地持久化来实现,所以需要实现序列化接口。但由于Java的 Serializable接口是一个重量级的API,所以Hadoop自定义一套新的API。
- 如果传递的参数是基本类型和字符串,可以直接使用Text,LongWritable,IntWritable 。但如果是自定义的 Java Bean,就需要自己实现Writable接口。
- Writable接口有两个方法需要实现:
- write(DataOutput var1) 会在序列化的时候被调用
- readFields(DataInput var1) 方法会在反序列化的时候被调用
4. 默认情况下,从map端到reduce端的键值对传输会按照key进行排序。假设map端输出的key是Text,无需实现其compareTo方法,因为系统默认已经实现了。
自定义排序WritableComparable
原理分析
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;
}