|
|
1
1
听起来您想使用组合器,它定义了在将创建的值发送到reducer之前,但在按键分组之后,如何处理这些值。 合并器通常被设置为只是reducer类(因此在map端进行reduce,然后在reduce端再次进行reduce)。 看看wordcount示例如何使用合并器预计算部分计数: http://wiki.apache.org/hadoop/WordCount 更新 以下是我对你的问题的看法;不过,我可能误解了你的想法。
每个映射器发出
合并器获取这些对的部分集:
减速器会
更新2 所以,既然我们知道了等级是连续的,因此,您不能使用合并器过早地过滤数据,唯一的事情就是做您建议的——进行二级排序。您已经找到了正确的记录单;在src/examples/org/apache/hadoop/examples/secondarysort.java中的hadoop 20中有一个如何做到这一点的示例(或者,如果您不想下载整个源代码树,可以查看 https://issues.apache.org/jira/browse/HADOOP-4545 ) |
|
|
2
4
听起来确实像是第二个排序问题。如果你愿意的话,可以看看“Hadoop:权威指南”。是O'Reilly寄来的。您也可以在线访问它。在这里,他们描述了一个非常好的实现。 我自己也实现了。基本上是这样工作的: 分区程序将关注所有具有相同键的键值对,这些键值对将流向一个reducer。这里没什么特别的。 但是也有GroupingComparator,它将形成分组。一个组实际上作为迭代器传递给一个reduce()-调用。因此分区可以包含多个分组。但是分区的数量应该等于减速器的数量。但是分组还允许在实现CompareTo方法时进行一些排序。 使用此方法,可以控制10个最佳/最差/最高/最低键将首先到达减速器。因此,在您阅读了这10个键之后,您可以离开reduce方法而不进行任何进一步的迭代。 希望能帮上忙——) |
|
|
3
0
如果我正确理解这个问题,你需要使用 TotalOrderPartitioner . |