java程序员的大数据之路(10):MapReduce的排序

排序

排序是MapReduce的核心技术。尽管应用本身可能不需要对数据排序,但仍对能使用MapReduce的排序功能来组织数据。

部分排序

默认情况下,MapReduce根据输入记录的键对数据集排序。当然我们也可以利用RawComparator来控制排列顺序。方法如下:
1. 设置属性mapred.output.key.comparator.class,调用JobConf的setOutputKeyComparatorClass()方法进行设置。
2. 键是WritableComparable的子类,并使用针对该键类的已登记的comparator。
3. 如果没有已登记的comparator,则使用RawComparator将字节流反序列化为一个对象,再由WritableComparable的compareTo()方法进行操作。
以上,我们已经可以得到若干个排序好的输出文件,但是想要将这些文件合并成一个有序文件却并不简单。直接将纯文本文件连接起来无法保证全局有序。下面我们就来讨论一下全局排序。

全排序

要想用Hadoop产生一个全局有序的文件,最简单的方法是使用一个分区。但是要处理大型文件时,这种方法效率非常低。
这里还有其他的方法,首先,创建一系列排好序的文件,然后串联这些文件,就可以生成一个全排序的文件了。这个方法的关键在于如何分区,但是想要建立分布均匀的分区就需要遍历整个数据集,这显然很不实用。所以我们采用抽样的方法,并根据采样结果建立分区。
在Hadoop中已经内置了一些采样器。InputSampler类实现了Sampler接口,这个接口的getSample(InputFormat

辅助排序

MapReduce在记录到达reducer之前按键对记录排序,但键对应的值并没有排序。有时我们的业务需要对值进行排序,这里可以定义包括自然键和自然值的组合键,键的comparator根据组合键进行排序,针对组合键的partitioner和分组comparator在进行分区和分组时只需要考虑自然键。

你可能感兴趣的:(Hadoop)