2

我正在考虑在 hadoop 中构建一个小型测试应用程序来掌握系统的窍门。

我想到的应用程序将在统计领域。我想从我的减速器函数中获得“每个键的 10 个最差值”(我必须假设某些键可能存在大量值)。

我的计划是进入我的减速器的值基本上是“实际值”和“实际值的质量/相关性”的组合。基于相关性,我“简单地”想要取 10 个最差/最好的值并将它们从减速器中输出。

我该怎么做(假设特定键有大量值)?有没有一种方法可以在将所有值发送到减速器之前对其进行排序(并且在我读取前 10 个时停止读取输入)或者必须以不同的方式完成?

有人可以指出我可以查看的一段示例代码吗?


更新:我发现了两个有趣的 Jira 问题HADOOP-485HADOOP-686

任何人都有关于如何在 Hadoop 0.20 API 中使用它的代码片段?

4

3 回答 3

4

听起来绝对像 SecondarySortProblem。如果您愿意,请查看“Hadoop:权威指南”。它来自奥莱利。您也可以在线访问它。他们在那里描述了一个非常好的实现。

我也是自己实现的。基本上它是这样工作的:partitioner 会关心所有 key-value-pairs 具有相同 key 的单个 reducer。这里没什么特别的。但也有 GroupingComparator,它将形成分组。一组实际上作为迭代器传递给一个 reduce() 调用。所以一个分区可以包含多个分组。但是分区的数量应该等于reducer的数量。但是分组还允许进行一些排序,因为它实现了 compareTo 方法。

使用这种方法,您可以控制 10 个最佳/最差/最高/最低的键将首先到达减速器。因此,在阅读完这 10 个键之后,您可以离开 reduce 方法而无需任何进一步的迭代。

希望这有帮助:-)

于 2009-10-21T10:34:41.453 回答
1

听起来您想使用组合器,它定义了在将您在 Map 端创建的值发送到 Reducer 之前如何处理它们,但在它们按键分组之后。combiner 通常被设置为 reducer 类(所以你在 map 端进行 reduce,然后再在 reduce 端)。

看看 wordCount 示例如何使用组合器来预先计算部分计数:

http://wiki.apache.org/hadoop/WordCount


更新 这是我对您的问题的想法;不过,我可能误解了您要做什么。

每个映射器都会发出<key, {score, data}>对。

组合器获取这些对的部分集合:<key, [set of {score, data}>并进行本地排序(仍在映射器节点上),并输出<key, [sorted set of top 10 local {score, data}]>对。

reducer 将得到<key, [set of top-10-sets]>——它所要做的就是对值集的每个成员执行 sort-merge 的合并步骤(不需要排序),并在提取前 10 个值时停止合并。


更新 2

因此,既然我们知道排名是累积性的,因此,您无法通过使用组合器及早过滤数据,唯一的事情就是按照您的建议进行 - 进行二次排序。您找到了正确的门票;在 src/examples/org/apache/hadoop/examples/SecondarySort.java 中有一个如何在 Hadoop 20 中执行此操作的示例(或者,如果您不想下载整个源代码树,可以查看示例https://issues.apache.org/jira/browse/HADOOP-4545中的补丁)

于 2009-09-30T16:14:50.127 回答
0

如果我正确理解了这个问题,您将需要使用TotalOrderPartitioner

于 2009-10-01T20:02:37.913 回答