【问题标题】:Why mapreduce secondary sorting is not on composite key's compareTo()?为什么 mapreduce 二次排序不在复合键的 compareTo() 上?
【发布时间】:2016-01-04 20:32:51
【问题描述】:

要执行二次排序,我们必须创建一个扩展 WritableComparable 接口并实现 compareTo() 的复合键。

在“Hadoop:权威指南”一书和几乎所有其他地方的博客中都显示排序是基于扩展 WritableComparator 的单独类(书中的 KeyComparator)的 compare() 方法进行的。

compare() 和 compareTo() 的逻辑相同。既然WritableComparator的compare()是用来对复合键排序的,那么CompositeKey的compareTo()到底是什么时候用的呢?

【问题讨论】:

    标签: sorting hadoop mapreduce


    【解决方案1】:

    Sortcomarator 用于对地图输出进行排序。如果您不指定 sortcomparator 类,它将使用自定义可写类的comapreTo() 方法。如果指定了 sortcomparator,它将使用它而不是自定义可写的 compareTo() 方法。但是使用默认的compare(WritableComparable a, WritableComparable b) 没有任何优势,这与 Writablecomparable comapreTo() 方法的相同,它将流中的记录反序列化为对象并进行比较。我认为 hadoop 使用 sortcomparator 而不是默认的 writablecomparable comapreTo() 方法,因为前者有一个最佳的 compare() 方法compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2),其中比较流中的记录而不将其反序列化为对象。

    希望这能回答你的问题。

    【讨论】:

      【解决方案2】:

      谢谢维涅什。我在书中进一步阅读(第 3 版,第 268 页)。

      控制排序顺序

      1. 如果属性 mapred.output.key.comparator.class 已设置,无论是显式设置还是通过在 Job 上调用 setSortComparatorClass(),然后 使用该类的实例。

      2. 否则,keys必须是WritableComparable的子类,并且使用key类注册的比较器。

      3. 如果没有注册比较器,则使用 RawComparator 将被比较的字节流反序列化为对象并 委托给 WritableComparable 的 compareTo() 方法。

      所以 IMO 当 key 没有实现 WritableComparable 接口或者我们对实现的 comparTo() 方法不满意时,那么只有 sortcomparator 才有意义。

      【讨论】:

      • 感谢您告诉我。我也认为 sortcomarator 在我们想要优化排序时很有用,通过比较记录而不将其反序列化为对象。但我还没有看到这在二次排序或其他地方实现。
      • 维涅什,明白了。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多