あくまで技術メモということで。
前回の最後に、
既に各ファイルのカウントは出来ているわけで、最後に全ファイルのカウントを加算したものを、
REDUCE_OUTPUT_RECORDSに設定してやれば良いのではないかと考える。
と書いた。
試した結論から書くと、それでうまくできることが分かった。
そもそもカウントされないのが正しいのだろうか、という疑問はあるが。
方法としては、Reducerのcleanupメソッドをオーバーライドして、そこに書いてやればいい。
MultipliOutputsを使用している時点で、おそらくオーバーライドしていると思うので、
そこにコードを追加する形になる。
前回は、1インクリメントしていたところを、MultipleOutputsのカウンタ分を加算するようにする。
for(Counter c : job.getCounters().getGroup(MultipleOutpus.class.getName())){
context.getCounter(Task.Counter.class.getName(), "REDUCE_OUTPUT_RECORDS").increment(c.getValue());
}
}
のようなイメージだ。
cleanupは、Mapタスクが複数生成されていても、ただ1度しか実行されない。
なので、MultipleOutputsのカウンタを全て加算してしまうことが必要。
これなら、まだ見せられるかな〜
もはや、完全にMultipleOutputsの使い方というより、
カウンタの使い方に寄ってしまっている。。。
このシリーズはこれで完結とします。