hadoop +每个减速机的一把钥匙

rak*_*shr 3 hadoop

在Hadoop中是否有一种方法可以确保每个reducer只获得映射器输出的一个键?

Nie*_*jes 6

这个问题对我来说有点不清楚.但我想我很清楚你想要什么.

首先,如果每次调用reduce时都没有做任何特殊操作,它只会获得一个带有一个或多个值的单个键(通过迭代器).

我的猜测是你要确保每个减速器都只有一个'键值对'.基本上有两种方法:

  1. 确保在映射器中输出的所有键都是唯一的.因此,对于每个键,只有一个值.
  2. 强制减速器通过强制组比较器来执行此操作,该组比较器简单地将所有键分类为不同的键.

所以,如果我正确理解你的问题.您应该实现一个GroupComparator,它只是声明所有键都不同,因此应该发送到不同的reducer调用.


由于这个问题中的其他答案,我正在添加更多细节:

有3种方法用于比较键(我从使用0.18.3 API的项目中提取了这些代码示例):

分区

    conf.setPartitionerClass(KeyPartitioner.class);
Run Code Online (Sandbox Code Playgroud)

分区程序只是为了确保"必须相同的东西最终在同一个分区上".如果你有一台计算机只有一个分区,所以这没有多大帮助.

关键比较器

    conf.setOutputKeyComparatorClass(KeyComparator.class);
Run Code Online (Sandbox Code Playgroud)

关键比较器用于通过查看键来对组中的"键 - 值对"进行排序......键必须以某种方式不同.

集团比较

    conf.setOutputValueGroupingComparator(GroupComparator.class);
Run Code Online (Sandbox Code Playgroud)

组比较器用于对不同的键进行分组,但必须在同一个reducer中发送.

HTH