MapReduce默认使用RawComparator对map的输出键进行比较排序。内置的Writable类(例如Text和IntWritable)是字节级实现。这样不用将字节形式的类解排列(unmarshal)成类对象。如果要通过WritableComparable实现自定义Writable,就有可能延长洗牌和排序阶段的时间,因为它需要进行解排列。
问题:
存在自定义的Writable。需要减少作业的排序时间。
方案:
实现字节级的Comparator来优化排序中的比较过程。
解决:
RawComparator接口提供两个方法:
1.public int compare(WritableComparable w1, WritableComparable w2){}
2.public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {}
采用第一种方法简单、易实现,但其性能也是我们需进行优化的原因。那么,让我们实现第二种:
实例:
假设我们定制的Writable为两个String的封装:
我们知道DataOutput.writeUTF方法会首先
用两个字节保存字符串的长度,然后再保存该字符串。
OK,接下来,让我们看该如何实现快速排序:
1.实现一个RawComparator接口,但这里我们只需继承
WritableComparator 即可
WritableComparator 是RawComparator 的一个通用实现。它提供了一个compareBytes方法实现字节级排序。
2.定制一个对象继承WritableComparator,实现以下方法:

先说一下compare的参数:
b1字段包含一个字节数组,其中包括字节形式的WritableComparable。
s1字段是指
WritableComparable对象起始字节的偏移量。
l1字段是指WritableComparable在字节数组中占用的字节数。
readUnsignedShort方法为获取从起始偏移量开始的前两个字节,该两个字节保存的为字符串的长度。
OK,排序完成。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29754888/viewspace-1694667/
,如需转载,请注明出处,否则将追究法律责任。