【问题标题】:long hadoop run, stuck at reduce>reduce长时间的hadoop运行,卡在reduce>reduce
【发布时间】:2013-06-22 07:53:44
【问题描述】:

我有 hadoop 运行,基本上只是聚合键,它的代码: (mapper是身份映射器)

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

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    查看百分比时,0-33% 是 shuffle,34%-65% 是 sort,66%-100% 是实际的 reduce 函数。

    在你的代码中一切看起来都很好,但我会在黑暗中试一试:

    您一遍又一遍地创建和重新创建字符串res。每次获得新值时,Java 都会创建一个新的字符串对象,然后创建另一个字符串对象来保存连接。如您所见,当字符串变得非常大时,这可能会失控。尝试改用StringBuffer。编辑:StringBuilder 优于 StringBuffer

    无论这是否是问题,您都应该更改它以提高性能。

    【讨论】:

    • 使用 StringBuilder 代替同步的缓冲区。
    【解决方案2】:

    使用 StringBuilder 可以解决这个问题。它将运行时间从 30 分钟缩短到 30 秒。我没想到会有这么大的不同。非常感谢。

    【讨论】:

    • ...并通过评论回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2012-05-10
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多