0

これが私の問題です。使用するデータセットが大きいので、キーごとの最大値を制限する必要があります。キーごとに10000以上の値がある場合がありますが、それ以上の値が必要です。

では、キーごとに「x」の値だけを取得するようにジョブを構成するにはどうすればよいですか?(任意のキー)reduceフェーズ後。

編集:これはreduceソースコードです。私の主な問題は、時々OutOfMemoryを取得することです。これは、StringBuilderが巨大になるためです。

構成を通じて、「キーごとに10.000の値が必要」と言う方法があるかもしれません。そうでない場合は、レデューサーに追加のコードを追加する必要があります...

public void reduce(Text domain, Iterable<Text> inLinks, Context context) throws IOException,
            InterruptedException {
        allInlinks = new StringBuilder();

        for (Text text : inLinks) {

                allInlinks.append(text.toString());
                allInlinks.append(",");               
        }

        allLinksText.set(allInlinks.toString());

        context.write(domain, allLinksText);
    }
4

2 に答える 2

2

reduce フェーズから出力されるレコードは (K, {V,V,V}) ではなく (K,V) の形式であるため、混乱する可能性があると思います。ここで、Map フェーズから出力されるレコードは (K, {V,V,V}) の形式であり、これらの中間値を圧縮するのはレデューサー次第です。独自の Java ベースの MapReduce ジョブを実行している場合は、コードを介して各フェーズから出力されるレコードの数を制限することを試みることができますが、これはビッグデータ パラダイムに正確には適合しません。データ/現在のソリューション/目的の出力について、さらに明確にする必要があります。

于 2013-02-07T21:50:36.943 に答える
1

このような単純なものは機能しませんか?多分私はあなたの質問を完全に理解していません。

reduce(Key key, Iterator<Value> values) {
    int count = 0;
    while (values.hasNext()) {
        if (count < x) {
            // do whatever
            count++;
        } else {
            return;
        }
    }
}

はい、各キーのすべての値がまだソートされてレデューサーにコピーされているという点で「無駄」がありますが、それを回避する方法は実際にはわかりません。コンバイナーで同様のことを行い、各キーに対して x までしか出力しないようにすることもできますが、キー/マッパーの分布によっては、それはほんの少しだけ役に立ちます。

于 2013-02-07T22:14:21.487 に答える