【问题标题】:Hadoop Mapreduce (Java) - error counting all unique words in text with Reducer as CombinerHadoop Mapreduce(Java)-使用Reducer作为Combiner计算文本中所有唯一单词时出错
【发布时间】:2018-04-22 15:34:20
【问题描述】:

我调整了标准字数统计 Hadoop 示例,以使用用户定义的计数器计算一系列输入文本文件中的所有唯一单词,并在驱动程序类中定义一个枚举,如下所示:

public enum Operations { UNIQUE_WC }

我在Reducer中的代码如下:

public class WordCountReducer extends Reducer <Text, IntWritable, Text, IntWritable> {

private IntWritable result = new IntWritable();

public void reduce(Text key, Iterable<IntWritable> values, Context context) 
   throws IOException, InterruptedException {
   int sum = 0;

   for (IntWritable val : values) {
        sum += val.get();
    }

   result.set(sum);
   context.write(key, result);    
   context.getCounter(WordCountJobControl.Operations.UNIQUE_WC).increment(1);
    }
}

当Reducer 类被设置为Combiner 时,这会导致奇怪的行为。计数器不接收 Reduce Input Groups/Reduce Output Records 的值,而是接收 Reduce Input Groups 和 Reduce Input Records 的总和,即唯一词加总词,或键加值。

谁能帮我理解为什么会发生这种情况背后的逻辑?据我了解(可能是错误的),如果有任何事情减少了给定的数量,那么这样做应该。

【问题讨论】:

  • 我发现问题是由我将 WordCountReducer 类设置为 Combiner 和 Reducer 引起的。我仍然不明白为什么它会产生这种效果。我正在改写这个问题来专门问这个问题。

标签: java mapreduce hadoop2


【解决方案1】:

以下是一个例子:

假设我们有两个文件 file1 和 file2。

文件 1 包含: 单词1 字2 词3 单词1

文件 2 包含: 单词1 词2

映射后,我们从两个映射函数(每个文件一个)得到以下输出:

对于文件 1: word1,1
word2,1
word3,1
word1,1

对于文件 2: word1,1
word2,1

然后使用与 reducer 功能相同的组合器将它们组合起来。键值对变为:

对于文件 1: word1,2
word2,1
word3,1

File2 保持不变。每个都应用了 reducer,所以我们将有 3 个 reducer 函数(每个单词一个)来获得总计数。您面临的问题是,如果计数器在 reducer 和 combiner 阶段递增,则计数器会为 file1 和 file2 中的每个单词递增,然后计数器在 reduce 阶段为每个单词再次递增(reduce 函数调用)。组合器的重点是为特定文件组合相同的键(而不是跨多个文件的所有键)。计数器不应在组合器阶段递增。

你正在做的是: 地图阶段:Counter=0 组合阶段: 在文件 1:Counter=4 在文件 2:Counter=previous value+2 合并阶段后值为 6。 减少阶段: 对于每个键计数器都会递增。所以计数器变成了 9。

希望这能解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2019-06-03
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多