Asakusa Framework0.7.1が出た!
→リリースノート
今回の目玉は「スモールジョブ実行エンジン」のみだが、この影響はすごく大きい。
Asakusaアプリケーションは複数のHadoopジョブとして実行されるが、ジョブの入力データ量が少ない場合に「スモールジョブ実行エンジン」で実行することにより、通常のHadoopジョブより速く実行できる。
スモールジョブ実行エンジンにはHadoopジョブの起動時間(いわゆるHadoop税)が無いので、実行が速い。(JavaVMの起動時間、いわばJavaVM税はかかるけど^^;)
スモールジョブ実行エンジンと通常のHadoopとの切り替えは、各ジョブ毎に、実行時のデータ量に応じて自動的に行われる。
Asakusaアプリケーションを作成すると いくつかの小さいジョブが生成されることがあり、小さなジョブは実行時間のほとんどがHadoop税となって、無駄が大きかった。
こういった「スモールジョブ問題」への対処として、今までにもYAESS JobQueue等があったが、環境構築が大変だった。
スモールジョブ実行エンジンを有効にするには、実行環境のASAKUSA_HOME/core/conf/asakusa-resources.xmlに以下のような設定を追加するだけでよい。
(『Hadoopタスクの最適化設定』を参照)
<property> <name>com.asakusafw.inprocess.limit</name> <value>10485760</value> </property>
ジョブの入力ファイルの合計サイズがこの指定(10485760=10MB)以下の場合はスモールジョブ実行エンジンで実行される。
(なお、このサイズを大きくし過ぎても逆効果で、OutOfMemoryErrorになったり、Hadoopで分散した方が速くなったりする)
実際、スモールジョブ実行エンジンを使用するだけで、実行時間が短縮されたバッチがあった。
未使用 | 使用 | 総ジョブ数 | スモールジョブ数 |
---|---|---|---|
約50分 | 約15分 | 約184 | 約180 |
約8分 | 約3分 | 約20 | 約17 |
約65分 | 約52分 | 約60 | 約10 |
上2つはかなり極端な例で、ほとんどがスモールジョブ^^;なので、3倍くらい速くなっている。
一番下のバッチはほとんどが大きなジョブだが、それでも20%くらい速くなっている。特にこの環境はAmazon EMRなので、1時間を切ると嬉しいらしいw(課金が1時間単位なので)
バッチ全体でなくスモールジョブだけで見ると、だいたい5倍くらい速くなりそうとのこと。
それと、スモールジョブ実行エンジンをフローのテストの実行にも使用することにより、テストの実行時間も短縮できる。
(テストデータはたいてい小さいだろうから、効果覿面w)
フローのテストでスモールジョブ実行エンジンを使うには、build.gradleのdependenciesにasakusa-test-inprocess-extの設定を追加する。
(『スモールジョブ実行エンジンを利用したエミュレーションモードの有効化』を参照)
dependencies { ~ testRuntime group: 'com.asakusafw', name: 'asakusa-test-inprocess-ext', version: asakusafw.asakusafwVersion
~ }
(build.gradleを修正したら、念のため「./gradlew installAsakusafw」(ASAKUSA_HOMEの下に実行環境を構築するコマンド)を実行しておこう)
実行時のデータ量に応じてHadoopクラスターとそれ以外(スモールジョブ実行エンジン)をAsakusaFWが自動的に切り替えてくれるといいなーと思っていたので、今回の対応はとても嬉しい(笑)
※コメント投稿者のブログIDはブログ作成者のみに通知されます