2012-11-26 56 views
3

我的Hadoop運行,基本上只是彙總了鑰匙,它的代碼: (映射爲身份映射器)長Hadoop的運行,停留在減少>減少

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

      String res = new String(""); 
      while(values.hasNext()) 
      { 
       res += values.next().toString(); 
      } 
      Text outputValue = new Text("<all><id>"+key.toString()+"</id>"+res+"</all>"); 
      results.collect(key, outputValue); 
    } 

它停留在這個水平:

12/11/26 06:19:23 INFO mapred.JobClient: Running job: job_201210240845_0099 
    12/11/26 06:19:24 INFO mapred.JobClient: map 0% reduce 0% 
    12/11/26 06:19:37 INFO mapred.JobClient: map 20% reduce 0% 
    12/11/26 06:19:40 INFO mapred.JobClient: map 80% reduce 0% 
    12/11/26 06:19:41 INFO mapred.JobClient: map 100% reduce 0% 
    12/11/26 06:19:46 INFO mapred.JobClient: map 100% reduce 6% 
    12/11/26 06:19:55 INFO mapred.JobClient: map 100% reduce 66% 

我在本地運行它,並看到這個:

12/11/26 06:06:48 INFO mapred.LocalJobRunner: 
    12/11/26 06:06:48 INFO mapred.Merger: Merging 5 sorted segments 
    12/11/26 06:06:48 INFO mapred.Merger: Down to the last merge-pass, with 5 segments left of total size: 82159206 bytes 
    12/11/26 06:06:48 INFO mapred.LocalJobRunner: 
    12/11/26 06:06:54 INFO mapred.LocalJobRunner: reduce > reduce 
    12/11/26 06:06:55 INFO mapred.JobClient: map 100% reduce 66% 
    12/11/26 06:06:57 INFO mapred.LocalJobRunner: reduce > reduce 
    12/11/26 06:07:00 INFO mapred.LocalJobRunner: reduce > reduce 
    12/11/26 06:07:03 INFO mapred.LocalJobRunner: reduce > reduce 
    ... 
    a lot of reduce > reduce ... 
    ... 

在年底,完成了這項工作。我想問:

1)它在這個reduce> reduce階段中做了什麼?

2)我該如何改進?

+1

日誌中的任何內容? –

回答

9

查看百分比時,0-33%是洗牌,34%-65%是排序,66%-100%是實際的降低功能。

一切看起來都在你的代碼很好,但我會採取刺傷在黑暗中:

你正在創建和重新再造字符串res一遍又一遍。每當你得到一個新的值時,Java都會創建一個新的字符串對象,然後創建另一個字符串對象來保存連接。正如你所看到的,當字符串變得很大時,這可能會失控。嘗試使用StringBuffer代替。編輯:StringBuilderStringBuffer更好。

無論這是否是問題,您應該改變它以提高性能。

+4

使用StringBuilder而不是被同步的緩衝區。 –

1

使用StringBuilder解決了它。它將運行時間從30分鐘提高到30秒。我不認爲這會有所作爲。非常感謝。

+9

所以,接受他的回答... –

+0

...並通過評論迴應! – samthebest