2013-01-10 54 views
2

以下是我在MapReduce作业中使用的Reducer功能的代码。 它应该将附加到每个值的迭代器+自定义字符串(“* ---”)的值返回给每个值。 但相反,它附加了自定义字符串两次。MapReduce作业Reducer中的奇怪行为

例如,如果值是ABC则 ,而不是打印

abc***--- 

在打印

abc***---***--- 

这是为什么发生?

代码:

public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, Text> { 

    public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { 

     while (values.hasNext()) { 

      Text t=values.next(); 
      String s = "***---"; 

      t.append(s.getBytes(), 0, s.length()); 

      output.collect(key, t); 

     } 

    } 

} 

回答

3

是否使用你的减速类也为Combiner?如果是这样,Reducer中的操作将被应用两次:一次在合并阶段(Map之后,shuffle/sort之前)以及Reduce阶段。

+0

您的答案很可能是正确的,但一些额外的细节:Hadoop实际上并不保证组合器运行,或者它只运行一次,通常它可能会被执行0-N次。 – tsiki

+0

是的。这正是发生了什么事。我也使用了同一个类的组合器。删除了,现在代码工作正常。不管怎么说,还是要谢谢你! :) –