长时间运行hadoop,停留在reduce>reduce

yzckvree  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(340)

我已经运行了hadoop,基本上只是在键上聚合,它是代码:(mapper是身份Map器)

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) 我该如何改进?

fcg9iug3

fcg9iug31#

从百分比上看,0-33%是shuffle,34%-65%是sort,66%-100%是实际的reduce函数。
在你的代码里,一切看起来都很好,但我要暗中试探一下:
您正在创建并重新创建字符串 res 一遍又一遍。每次获得一个新值时,java都会创建一个新的string对象,然后创建另一个string对象来保存连接。正如你所看到的,当弦变得相当大时,这可能会失控。尝试使用 StringBuffer 相反。编辑: StringBuilder 比…好 StringBuffer .
无论这是否是问题所在,您都应该对此进行更改以提高性能。

70gysomp

70gysomp2#

使用stringbuilder可以解决这个问题。它将运行时间从30分钟提高到30秒。我没想到会有这么大的不同。谢谢。

相关问题