2013-01-10 96 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

是的。這正是發生了什麼事。我也使用了同一個類的組合器。刪除了,現在代碼工作正常。不管怎麼說,還是要謝謝你! :) –