Sorting 在将值发送到减速器之前对其进行排序

Sorting 在将值发送到减速器之前对其进行排序,sorting,hadoop,mapreduce,Sorting,Hadoop,Mapreduce,我正在考虑在hadoop中构建一个小型测试应用程序,以掌握系统的窍门 我想到的应用程序将是在做统计的领域。 我想从我的reducer函数中得到“每个键的10个最差值”(我必须假设某些键可能有大量值) 我计划的是,我的减速机中的值基本上是“实际值”和“实际值的质量/相关性”的组合。 基于相关性,我“简单地”想要取10个最差/最佳值,并从减速器输出它们 我该怎么做(假设一个特定的键有大量的值)? 是否有一种方法可以在将所有值发送到减速机之前对其进行排序(并在读取前10个值时停止读取输入),或者必须以

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

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

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

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

这里有人能给我指一段我可以看一下的示例代码吗


更新:我发现了两个有趣的Jira问题和


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

听起来你想使用一个组合器,它定义了你在映射端创建的值在发送到Reducer之前,但在按键分组之后该如何处理。 合并器通常被设置为只是reducer类(因此您可以在map端进行reduce,然后再在reduce端进行reduce)

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


更新 以下是我对你的问题的看法;不过,我可能误解了你的意图

每个映射器都会发射

组合器获取这些对的部分集合:
并进行本地排序(仍在映射器节点上),并输出

reducer将获得
——它所要做的就是对值集的每个成员执行sort merge(无需排序)的合并步骤,并在提取前10个值时停止合并


更新2


因此,现在我们知道排名是累积的,因此,您不能使用组合器提前筛选数据,唯一的事情就是按照您的建议进行二次排序。你找到了合适的票;在Hadoop 20中,src/examples/org/apache/Hadoop/examples/SecondarySort.java(或者,如果您不想下载整个源代码树,可以查看中的示例补丁)

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

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

我自己也实现了。基本上它是这样工作的: 分区程序将关注所有键-值对,这些键将同一个减缩器中的同一个键。这里没什么特别的。 但是还有GroupingComparator,它将形成分组。一个组实际上作为迭代器传递给一个reduce()调用。所以一个分区可以包含多个分组。但是分区的数量应该等于还原器的数量。但是分组还允许在实现compareTo方法时进行一些排序

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


希望这是有帮助的:-)

Hmm,据我所知,组合器是“在特定节点上运行的部分减速器”。我当时无法截断结果,因为我不知道当时值的总“质量”。更新:有趣的建议。这样做(合并已经截断的子集)通常会产生与“精确”方式不同的输出。这对我的处境来说可能已经足够好了。我会考虑的。谢谢。你能解释一下为什么这会导致不同的输出吗?我认为全球排名前10的项目肯定包含在每个分区的前10个项目中(可能是一个分区的前3个、另一个分区的前2个、第三个分区的前5个,但它们都在其中);映射器1生成值(表示法:{data,score}):{A,12},{B,11},{C,10}。映射器2生成:{D,11},{E,10},{C,9}。如果你按照建议的方式做,那么最终结果将是{A,12},{D,11}。期望的结果是{C,19},{A,12}。在两个映射器中,{C,x}被组合器切断。这种影响可以通过使组合器截断到比最终值稍微大一点来减少。假设合路器截断为25,减速器截断为10。但是这种效果还是会发生的。哦,我不知道分数是累积的。现在就开始,一两天后就有了新的想法。