3

基本的にキーを集約するだけのHadoopを実行しましたが、そのコードは次のとおりです:(マッパーはIDマッパーです)

    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)どうすればこれを改善できますか?

4

2 に答える 2

11

パーセンテージを見ると、0 ~ 33% がシャッフル、34% ~ 65% がソート、66% ~ 100% が実際のリデュース機能です。

あなたのコードではすべて問題ないように見えますが、暗闇の中で突き刺します:

文字列を何度も作成して再作成していresます。新しい値を取得するたびに、Java は新しい文字列オブジェクトを作成し、連結を保持する別の文字列オブジェクトを作成します。ご覧のとおり、文字列がかなり大きくなると、これは手に負えなくなります。StringBuffer代わりにa を使用してみてください。編集:StringBuilderよりも優れていStringBufferます。

これが問題であるかどうかにかかわらず、これを変更してパフォーマンスを改善する必要があります。

于 2012-11-26T05:12:38.533 に答える
3

StringBuilder を使用すると解決します。実行時間が 30 分から 30 秒に短縮されます。こんなに違うとは思いませんでした。どうもありがとう。

于 2012-11-26T22:01:15.623 に答える