コンバイナーは、レデューサーと同じクラスとほとんど同じコードを使用して作成されます。しかし、ソートとシャッフルの前、または削減の前に正確に呼び出されるのはいつですか? 並べ替えとシャッフルの前、つまりマッパーの直後の場合、どのように入力を取得します[key, list<values>]
か? これはソートとシャッフルによって与えられるためです。並べ替えとシャッフルの後、つまりレデューサーの直前に呼び出された場合、コンバイナーへの出力はレデューサーのようであり[key, value]
、レデューサーはどのように入力を取得します[key, list<values>]
か?
4 に答える
コンバイナーの出力タイプは、マッパーの出力タイプと一致する必要があります。Hadoop は、コンバイナーが適用される回数、またはまったく適用されることさえ保証しません。
マッパーが拡張Mapper< K1, V1, K2, V2 >
し、リデューサーが拡張
Reducer< K2, V2, K3, V3 >
する場合、コンバイナーは の拡張である必要があります Reducer< K2, V2, K2, V2 >
。
Combiner
操作と同じマシンで適用されmap
ます。必ずシャッフル前。
Hadoop のドキュメントを参照:
マップ操作がそのペアを出力するとき、それらはすでにメモリ内で利用可能です。効率上の理由から、reduce-type 関数を実行するコンバイナー クラスを提供することで、この事実を利用することが理にかなっている場合があります。コンバイナが使用されている場合、マップのキーと値のペアはすぐには出力に書き込まれません。代わりに、キー値ごとに 1 つのリストで、リストに収集されます。特定の数のキーと値のペアが書き込まれると、各キーのすべての値をコンバイナの reduce メソッドに渡し、元のマップによって作成されたかのように結合操作のキーと値のペアを出力することによって、このバッファがフラッシュされます。手術。
カスタム コンバイナを記述しても、Map Reduce フレームワークは常にコンバイナを呼び出すわけではありません。スピルの数が少なくとも 3 (デフォルト) の場合、確実にコンバイナーを呼び出します。コンバイナーを実行する必要があるスピルの数は、プロパティを介して設定できmin.num.splits.for.combine
ます。