Hadoop中是否有办法确保每个reducer只获得mapper输出的一个键?
答案 0 :(得分:6)
这个问题对我来说有点不清楚。但我想我很清楚你想要什么。
首先,如果每次调用reduce时都没有做任何特殊操作,它只会获得一个带有一个或多个值的单个键(通过迭代器)。
我的猜测是,您希望确保每个缩减器都只获得一个“键值对”。 基本上有两种方法:
所以,如果我正确理解你的问题。您应该实现一个GroupComparator,它只是声明所有键都不同,因此应该发送到不同的reducer调用。
由于这个问题中的其他答案,我正在添加更多细节:
有3种方法用于比较密钥(我从使用0.18.3 API的项目中提取了这些代码示例):
<强>分区强>
conf.setPartitionerClass(KeyPartitioner.class);
分区程序只是为了确保“必须相同的东西最终在同一个分区上”。如果你有一台计算机,那么只有一个分区,所以这没什么用。
Key Comparator
conf.setOutputKeyComparatorClass(KeyComparator.class);
键比较器用于通过查看键来对组中的“键值对”进行排序...键必须以某种方式不同。
群组比较者
conf.setOutputValueGroupingComparator(GroupComparator.class);
组比较器用于对不同的键进行分组,但必须在同一个reducer中发送。
HTH
答案 1 :(得分:1)
您可以通过实施Partitioner接口
来控制哪些密钥被发送到哪个reducer来自Hadoop API文档:
分区程序控制分区 中间人的钥匙 地图输出。关键(或其中的一个子集) 密钥)用于导出 分区,通常是哈希 功能。总人数 分区与数字相同 减少工作的任务。于是 这可以控制m中的哪一个减少 任务中间密钥(因此 记录)被送去减少。
下面的书在描述分区,关键排序策略和权衡以及地图缩减算法设计中的其他问题方面做得很好:http://www.umiacs.umd.edu/~jimmylin/book.html
答案 2 :(得分:0)
我的猜测与上面相同,只是你可以在可能的情况下对键进行排序,并尝试根据你的分区标准为它分配reducer,参考youtube mapreduce ucb 61a讲座-34,他们谈论这些东西。
答案 3 :(得分:0)
你确定要这么做吗?你能详细说明你的问题,这样我才能理解 为什么你要这样做。
你必须做两件事,如前面的答案所述
普拉纳布