如何在Hadoop中对自定义可写类型进行排序

时间:2019-03-13 01:27:16

标签: java sorting hadoop mapreduce hadoop2

我有一个自定义类型,其中包含Hadoop本机类型的字段(例如TextIntWritable),并且需要在混洗/排序阶段将其用作键并按需要进行排序。也有类似的问题,例如this onethis one,但它们与使用本机类型有关。如何使用自定义类型获得相同的结果,需要满足哪些要求?

1 个答案:

答案 0 :(得分:0)

实现此结果有细微差别,有些是显而易见的,有些则不是。我将在短时间内尝试解释它们:

  1. 首先,自定义类型必须实现WritableComparable而不是仅实现Writable,并且当然要定义compareTo()方法。
  2. 来自Hadoop: The Definitive Guide的重要提示:

      

    所有可写实现都必须具有默认构造函数,以便MapReduce框架可以实例化它们,然后通过调用readFields()填充其字段。

    也许最容易出错的部分是默认构造函数应实例化该字段(如果未初始化),因为它们不得为空。

  3. 这一点是关于创建自定义比较器的,如果您对默认排序不满意。在这种情况下,您需要创建一个新类,该类扩展WritableComparator并覆盖其compare()方法。此后,您有两种使用此比较器的方法,而不是默认的比较器:,您可以在Job的setSortComparatorClass方法的帮助下设置要使用的此类:

    job.setSortComparatorClass(YourComparator.class)
    

    将其注册到您自定义类型的静态块中:

    static {  
        WritableComparator.define(CustomType.class, new YourComparator());
    }
    
      

    静态块注册原始比较器,以便每当MapReduce看到该类时,它都知道将原始比较器用作其默认比较器。

Here是带有静态嵌套比较器的此类的示例。