MapReduce で実行される操作が交換可能かつ結合的でない場合、コンバイナーをレデューサーと同じにすることはできません。
たとえば、平均値を計算する場合、コンバイナーはキーの値を合計し、リデューサーは合計してから、その合計をそのキーの値の総数で割ります。コンバイナのコードはわずかに変更されています。コンバイナーとリデューサーの両方に同じクラスを使用し、現在のタスクがコンバイナーかリデューサーかを判断できるコードを用意できるとしたら? レデューサーであることがわかった場合は、合計をカウントで除算します。
このようなもの:
protected void reduce(Text keyIn, Iterable<PairWritable> valuesIn,
Context context)
throws IOException, InterruptedException {
double sum = 0.0d;
long count = 0l;
for (PairWritable valueIn : valuesIn) {
sum += valueIn.getSum();
count += valueIn.getCount();
}
if (THIS_IS_A_REDUCER) {
sum /= count;
}
context.write(keyIn, new PairWritable(sum, count));
}
これを行うことは可能ですか?上記のコードの平和THIS_IS_A_REDUCER
を何かに置き換えることはできますか?
タスクの試行 ID 文字列からタスクがマッパーかレデューサーかを判断できますが、コンバイナーとレデューサーの両方が同様の文字列パターンを持っているようです。