1

这个问题是关于 Map/Reduce 排序的。我有三个领域

XXID, Identifier, TimeStamp

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

我希望排序是这样的,即所有相同的 XXID 都进入同一个减速器,并且在可迭代中,具有 1 的字段首先出现在具有增加时间戳的迭代中,其次是具有 2 的字段。

有人可以帮我吗?

4

1 回答 1

3

你这样做肯定违反了 mapreduce 框架,但你必须做你必须做的!


首先,排序只在键上进行。因此,您必须假设这些值将按任意顺序排列。因此,我们需要弄清楚如何获取 XXID、Identifier 和 TimeStamp,所有这些都在 key 中。(您现在可能只使用 NullWriteable 作为值)

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

您要自定义 MapReduce 类别的项目的方式是从ComparableJavanxTriple更改.compareTo函数。使其首先比较 XXID,然后是 1 或 2,然后是时间戳。


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


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

为了解决这个问题,在 Reducer 类中使用一些静态变量来跟踪 reduce 函数中发生的事情。您必须检测 XXID 何时更改,以便知道切换下一个分析。您可能必须使用setup 和 cleanup方法来设置和完成。

于 2012-09-21T18:18:15.683 回答