|
ProgrammingGuideMapperReducer
SSS Mapreduce Programming Guide - Mapper/Reducer class
en , ja Mapper/ReducerクラスMapper/Reducerのクラスの定義についてWordCountでは紹介できなかった部分について説明を行います。 複数出力SSS MapreduceではMapper/Reducerは出力先を複数持つことができます。 その場合には、map/reduceメソッドの引数の末尾にOutput型のものを追加します。 2つ出力を持つMapperの例を以下に示します。 public class MyMapper extends Mapper {
public void map(Context context,
PackableInt key, PackableString value,
Output<PackableString, PackableInt> output1,
Output<PackableInt, PackableDouble> output2) throws Exception {
// 処理内容…
}
}それぞれの出力先の型は同じである必要はありません。 また、出力先を複数にした場合には、Job.BuilderにてJobを作成する際にaddOutputを出力先の数だけ呼び出しぞれぞれの出力先に対して出力先のTupleGroupを指定する必要があります。 GroupID input = ...;
GroupID output1 = ...;
GroupID output2 = ...;
engine.getJobBuilder("MyMapper", MyMapper.class)
.addInput(input)
.addOutput(output1)
.addOutput(output2) // 出力を2つ指定
.build();注意: Combinerとして利用するクラスでは複数の出力を利用することはできません。 前処理用メソッドMapper/Reducerクラスはそれぞれ、configureメソッドを持っています。 このメソッドはMapper/ReducerがTupleを読み込み実行を開始する前にSSS Mapreduceによって呼び出されます。 したがってこのメソッドをオーバーライドすることで前処理を実行することができます。 Mapper/Reducerのデフォルトの実装は何も処理を行わないため、特にオーバーライドした際に親クラスのconfigureを呼び出す必要はありません。 以下にシグネチャのみを記述したものを示します。 public class MyMapperextends Mapper {
@Override
public void configure(Context context) {
// 前処理…
}
public void map(Context context,
PackableInt key, PackableString value,
Output<PackableString, PackableInt> output1,
Output<PackableInt, PackableDouble> output2) throws Exception {
// 処理内容…
}
}後処理用のメソッドconfigureメソッドとは逆に、すべてのTupleを処理し終わったあとに実行されるメソッドを定義することもできます。 SSS Mapreduceは「cleanup」という名称をもつメソッドがMapper/Reducerに定義されていると、それをMapper/ReducerがすべてのTupleを処理し終わったあとに呼び出します。 cleanupは以下の引数を持つ必要があります。
必要な引数からわかる通り、cleanupメソッドではmap/reduceメソッドと同様にTupleを出力することが可能です。 そのため、Outputで指定される出力先のキー及びバリューの型はmap/reduceメソッドと同じなくてはなりません。 また、map/reduceメソッドが複数の出力先を持つ場合には、cleanupメソッドも同じ数の出力先をもつ必要があります。 以下にシグネチャのみを記述したものを示します。 public class MyMapper extends Mapper {
public void map(Context context,
PackableInt key, PackableString value,
Output<PackableString, PackableInt> output1,
Output<PackableInt, PackableDouble> output2) throws Exception {
// 処理内容…
}
public void cleanup(Context context,
Output<PackableString, PackableInt> output1,
Output<PackableInt, PackableDouble> output2) throws Exception {
// 後処理…
}
}
| |