什么是 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文章。

10-07 17:30