1~100を合算するHadoopプログラムの続き。ネタを思い付いたので、Counterを使ったバージョンを作ってみた(笑)
HadoopのCounterは、メトリクス的な情報(処理件数とかバイト数とか)を各タスクで加算していって最終的に表示するもの。
デフォルトで「Map処理の出力レコード数」というカウンターがあるから、各タスクで1~100件のレコードを出力してやれば、合計の出力レコード数が1~100の合算値になる!(爆)
まぁそれだとさすがにあまりに酷いのでw、ちゃんとしたカウンターを使うバージョンも作ってみた。
とは言え、そもそもこういった使い方をするのは疑問だけど^^;
ところで、カウンターは各タスクで加算していき、最終的に実行元のジョブで合算されるのだが、途中経過でも(ブラウザーから)カウンター値は見られる。
で、タスクは投機的実行されたり障害で落ちて別タスクに切り替わったりするので、カウンターが重複して加算されることがないか気になったので、試してみた。
まず、タスクを途中でkillしたら、ジョブのカウンター値はその分だけ減った!
そして再実行タスクが2つ実行されたが、片方が正常終了したらその分だけ最終的に合算されるようだった。
つまり、カウンターが重複して合算されることは無いようなので、気にしなくていいみたいだ。
ちなみに、ジョブやタスクを制御するコマンドはhadoop job系。-listでジョブ一覧を表示し、-killでジョブを強制終了させる。で、-kill-taskでタスクを終了させる。
hadoop job -kill-task attempt_201111010257_0926_m_000000_0
カウンターを表示するコマンドもあるんだけど、上手く表示されなかったorz
(常に0が表示される。つまりカウンター名が間違っている?)
hadoop job -counter job_201111010257_0927 example.Sum100Counter2$MyCounter SUM