2014/5/22にAsakusa Framework0.6.2が出ていて、ブログを書こうと思っていたのに、忙しくて延び延びになってた^^;
→リリースノート
(ちなみに忙しくてもDQ10の日課はやってるよ、あれは精神安定剤のようなものだから、むしろやらねばならんw)
今回は主に運用環境(実行時の設定)周りの機能が増えている。
まず注目したいのは、「小さなジョブ」に関する最適化。
Asakusaアプリケーションの場合、複数のファイルを結合したりするので、少量多種のファイルを扱うことがよく出てくる。これはHadoopの本来の使途からすると外れていて、Hadoopの苦手とするところorz
入力データサイズが小さい(理想的にはすぐ終了するはずの)ジョブであっても、Hadoopのタスク起動にはそれなりの時間(いわゆるHadoop税)がかかるので、遅い。
特にタスクは分散しているのだけれどもそれぞれのタスクの出力量は少ない場合、小さいファイル(最悪の場合は0バイトのファイル)が大量に出来てしまう。後続ジョブではファイル数(ブロック数)分のMapタスクが作られるので、無駄な時間の累計が増えてしまう。
そこで、1つのMapタスクで複数のファイル(入力スプリット)を読むようにすれば、総体としてHadoop税が減る。→入力スプリットの結合
また、Reduceタスク数を減らせば、出力ファイル数(後続ジョブに渡るファイル(スプリット)数)も減らせる(1タスクが1ファイル出力するので)。→Reduceタスクの調整
これらのタスク数を調節する為のオプション(ファイルサイズの閾値)が指定できるようになった。
それと、対応プラットフォームについては、Hadoop2系(CDH5)が増えてきた。
Hadoop2系にはuber mode(ユーバーモード。uberはドイツ語?)というのがあるらしく、これを使うと小さなジョブの実行をHadoop側でも速くできるらしい。
uberモードについては(象本第3版には載っているらしいが)よく知らないので以下は憶測だが。
通常のHadoop2(YARN)では、アプリケーションマスター(AM)がタスク実行用のコンテナーを起動してジョブを実行する。(JobTrackerとTaskTrackerの関係と同様で、コンテナーは別マシン上に別JavaVMを起動して動く)
ただ、条件を満たした場合(概ね、タスク数が少なくて入力データが小さくてメモリーに乗り切ること?)は、アプリケーションマスターが直接ジョブを実行する(AMと同じJavaVM上でジョブを動作させる)ことによって、コンテナー起動のコストを抑えるらしい。これがuberモード。
AsakusaFWでもジョブの振り分け機能で小さなジョブをスタンドアローンHadoopに振り分けることによってHadoop税を軽減させる方策があったけど、それをHadoopが自動的に実施してくれる感じかな?
つまり、AsakusaFWの「小さなジョブの最適化」とuberモードが組み合わさると、いい感じになるかも?!
あとは、YAESSログの可視化ツール!
Asakusaアプリケーションは複数のHadoopジョブに分かれるので、実行時間を解析するときは、ジョブ毎の実行時間を調べるのが最初のステップ。
その為にYAESSログからジョブの開始と終了の行を抽出して…ということをよくやっていたのだけれど、それをやってcsvファイルにして出力してくれるらしい!
gradlewコマンドを使うということは、実行環境で出力されたYAESSログを開発環境にコピーしてくる必要はある。
レポートファイルの例には実行時間を表す棒グラフも付いているけど、csvファイルにそんなものが入れられるわけが無いから、これはExcelの機能でこういう事も出来るという例だろう。