Reducer クラス

中間データをソートして再分配した後、同じキーに関連するすべての値は、単一のリデューサー(Reducerクラスの同じインスタンス)によって処理されます、 通常、リデューサーは与えられた値を最終的な結果に集約します。 リデュースの回数は中間データの分布によって決まる。 つまり、フレームワークは各データスライスに対して1つのリデュースタスクを起動する。

<K2, listV2)>* → Reducer →<K3,V3>*となる

Reducerの実装は、setup()、reduce()、cleanup()、run()の4つのメソッドで構成されています。デフォルトでは、run() メソッドは setup() メソッドを一度だけコールし、次に reduce() メソッドを <キー, (値のリスト)> のペアごとにコールします。 例:
public void run(Context context) throws IOException,
InterruptedException {
setup(context);
while (context.nextKey()) {
reduce(context.getCurrentKey(), context.getValues(), context);
}
cleanup(context);
}

reduce() メソッドは、デフォルトでは入力が出力となり、ID 関数として動作します。 (高度な使用例のための run() を含め、これらのメソッドのどれでもオーバーライドできる)

Reducerのコンテキストオブジェクト

Reducerはコンテキストオブジェクトにアクセスすることができ、これによりReducerは環境の残りの部分と対話することができます。 reducerや他のメソッドの引数として渡されるcontextオブジェクトは、ジョブの設定データへのアクセスを提供し、Context.write(key, value)メソッドを使用してreducerが出力ペアを生成できるようにします。

Context.getConfiguration() メソッドは、実行中の map/reduce プログラムの設定データを含む設定オブジェクトを返します。 ジョブ内で任意の (key, value) ペアの設定データを設定し (例えばJob.getConfiguration().set("myKey", "myVal") メソッドで設定します)、Context.getConfiguration().get("myKey") メソッドでこのデータをリデューサで取得します。 (これは通常、レデューサーのsetup()メソッドで行われます)

cleanup()メソッドは主にオーバーライドされる(デフォルトではクリーンアップは行われない)。 すべての入力が処理された後にクリーンアップを実行する必要がある場合は、デフォルトをオーバーライドして、指定されたユースケースに合うように設定することができる。

レデューサー・クラスを定義する必要はありません。 クラスを定義しない場合、マッパーの出力レコードはソートされずに直接出力テーブルに格納され、パーティショニングの再配分とリデュースのフェーズはスキップされる)。