Reducer クラス
中間データをソートして再分配した後、同じキーに関連するすべての値は、単一のリデューサー(Reducerクラスの同じインスタンス)によって処理されます、 通常、リデューサーは与えられた値を最終的な結果に集約します。 リデュースの回数は中間データの分布によって決まる。 つまり、フレームワークは各データスライスに対して1つのリデュースタスクを起動する。
<K2, listV2)>* → Reducer →<K3,V3>*となる
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()メソッドは主にオーバーライドされる(デフォルトではクリーンアップは行われない)。 すべての入力が処理された後にクリーンアップを実行する必要がある場合は、デフォルトをオーバーライドして、指定されたユースケースに合うように設定することができる。
レデューサー・クラスを定義する必要はありません。 クラスを定義しない場合、マッパーの出力レコードはソートされずに直接出力テーブルに格納され、パーティショニングの再配分とリデュースのフェーズはスキップされる)。