4

いくつかの記事から、コンバイナーはマッパー側とリデューサー側で実行され、0~N 回実行されることがわかっています。そして、コンバイナーが呼び出されたかどうかにかかわらず、mapreduce プログラムは同じ結果を得る必要があることを知っています。

しかし、コンバイナーが少なくとも1回呼び出される必要がある特別な状況が1つあります。それを確認する方法を知っている人はいますか?

PS、ではmaptask.java、次の行を見ました:

if (null == combinerClass || numSpills < minSpillsForCombine) {
    Merger.writeFile(kvIter, writer, reporter);
} else {
    combineCollector.setWriter(writer);
    combineAndSpill(kvIter, combineInputCounter);
}

minSpillsForCombineをゼロに設定した場合、コンバイナーが少なくとも 1 回呼び出されるようにすることはできますか?

どうもありがとう!

4

2 に答える 2

3
  • スピル中、スピルしているスレッドがディスクに書き込む前に、スレッドは最初に、最終的に送信されるレデューサーに対応するパーティションにデータを分割します。
  • 各パーティション内で、バックグラウンド スレッドがキーによるメモリ内並べ替えを実行し、結合関数がある場合は、 sort の出力で実行されます
  • スピルファイルが 3 つ以上ある場合は、出力ファイルが書き込まれる前にコンバイナーが再度実行されます。
  • プロパティをオーバーライドすることで、このマジック ナンバー 3 を変更できます: mapreduce.map.combine.minspills
  • コンバイナは、最終結果に影響を与えることなく、入力に対して繰り返し実行できます。
  • スピルが 1 つまたは 2 つしかない場合、map 出力サイズの潜在的な削減は、結合器を呼び出す際のオーバーヘッドに値しません

お役に立てれば。

于 2016-07-24T09:55:35.283 に答える
2

コンバイナーを少なくとも 1 回実行する必要がある場合は、コンバイナーを誤用しています。その役割は、厳密にオプションであり、結合/可換の性質を持つ値を折りたたむものです。理由を詳しく言えば、より良いデザインを提案できるかもしれません。

于 2013-07-25T04:38:27.593 に答える