什么是 RawComparator 及其含义?
是否必须对每个mapreduce程序使用RawComparator?
最佳答案
RawComparator直接对对象的字节表示形式进行操作
,并非必须在每个 map 缩减程序中使用它
MapReduce从根本上说是一个批处理系统,而不是
适用于交互式分析。您无法运行查询并在几秒钟或更短的时间内获得结果。查询通常需要几分钟或更长的时间,因此最适合离线使用,因为在处理循环中没有人坐在那里等待结果。
如果您仍想优化Map Reduce Job花费的时间,则必须使用RawComparator。
使用RawComparator:
中间键值对已从Mapper传递到Reducer。在这些值从Mapper到达Reducer之前,将执行随机和排序步骤。
排序得到了改进,因为RawComparator将按字节比较键。如果我们不使用RawComparator,则必须完全反序列化中间键才能进行比较。
示例:
public class IndexPairComparator extends WritableComparator {
protected IndexPairComparator() {
super(IndexPair.class);
}
@Override
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
int i1 = readInt(b1, s1);
int i2 = readInt(b2, s2);
int comp = (i1 < i2) ? -1 : (i1 == i2) ? 0 : 1;
if(0 != comp)
return comp;
int j1 = readInt(b1, s1+4);
int j2 = readInt(b2, s2+4);
comp = (j1 < j2) ? -1 : (j1 == j2) ? 0 : 1;
return comp;
}
}
在上面的示例中,我们没有直接实现RawComparator。相反,我们扩展了WritableComparator,它在内部实现了RawComparator。
有关更多详细信息,请参考此RawComparator文章。