MapReduce在三个字段的基础上进行排序

时间:2012-09-21 17:53:16

标签: hadoop mapreduce

这个问题与Map / Reduce排序有关。我有三个字段

XXID, Identifier, TimeStamp

XXID可以是任何字符串值,标识符有两个可能的值1或2

我希望排序是这样的,所有相同的XXID都转到同一个reducer,而在iterable中,带有1的字段首先出现在迭代中,时间戳增加,而下一个字段为2。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

你肯定违反了mapreduce框架来做这件事,但你必须做你必须做的事情!


首先,只对密钥进行排序。因此,您必须假设值将以任意顺序排列。因此,我们需要弄清楚如何将密钥中的XXID,Identifier和TimeStamp全部放在一起。 (你现在可以只使用NullWriteable作为值)

要将这三个项目放入一个键,您应该通过实现WriteableComparable来创建一个新的数据类型。让这个新类包装三个值,让我们称之为JavanxTriple

您要自定义MapReduce类JavanxTriple项的方法是从Comparable更改.compareTo函数。这样做首先比较XXID,然后是1或2,然后是时间戳。


接下来,您需要解决以下问题:由于每个事物都是单独的键,因此默认情况下数据将转到不同的reducer。开箱即用,您将无法计算所需的数据流。要解决此问题,您需要编写自定义partitioner。分区器告诉每个记录将去哪个reducer。为此,您可以覆盖.getPartition。在计算.getPartition时,仅使用XXID来确定此数字(而不是密钥的Identifier和TimeStamp部分)。他们这样,具有相同XXID的所有项目都被发送到同一个reducer。


最后,您现在遇到的问题是您实施减速器的方式不典型。每个键只调用一次reduce,传入的Iterable只有一个NullWriteable。

要解决此问题,请在Reducer类中使用一些静态变量来跟踪reduce函数中发生的情况。您必须检测XXID何时更改,以便您知道要切换下一个分析。您可能必须使用setup and cleanup方法进行设置并完成工作。