oozie の launcher ジョブに設定をかます

oozie の非同期アクションは、アクション起動用のmapper一つだけの mapred ジョブ(launcher)を起動することで実行される。
例えば、Hiveアクションやmapredeuceアクションの場合、まず、mapper一つだけの mapreduce ジョブが起動され、その map タスク上でアクションのmapreduceジョブ(Hiveクエリや素のmapreduceジョブ)を起動する。

ここで問題になるのが、この launcher ジョブ。
スロット数の少ないクラスタでは、一度にたくさん oozie workflow を起動すると、launcher ジョブでスロットが埋め尽くされてしまう。
そして、Hiveアクションやmapredeuceアクション等のlauncher ジョブでスロットが埋め尽くされてしまった場合、デッドロック状態になってしまうのだ。

launcher ジョブはアクションが終了したのを確認してから終了するので、ずっとスロットを占有したままになる。一方、launcher により起動されたアクションの mapredeuce ジョブは、スロットの空きを待つが、そのスロットはlauncher ジョブによって占有されている。なので、目的のmapredeuce ジョブはいつまでも処理が進まず、そのため、launcher ジョブも終了せずにスロットを占有したまま・・・

解決するには、launcher ジョブとアクションのジョブを別の queue で実行すること。CapacityTaskScheduler を使い、それぞれのジョブ用のqueue を定義しておく。
launcher ジョブのqueue を指定するには、workflow.xml でアクションの configuration 要素に oozie.launcher.mapred.job.queue.name という設定名でqueue 名を指定する。

※おまけ

oozie の仕様で、workflow.xml の configuration 要素に「oozie.launcher.XXX」という名前のpropertyを入れておくと、LauncherのMapperの「XXX」という名前のpropertyとして設定される。
(job-xmlに指定してもダメらしい。)