スケジューラ色々
Chinachuのエンコードジョブのバッチ管理にAzkabanを使っていたのだが、若干不満もあるので他に良いツールがないか調べてみた。 結果、今のところAzkabanが最適だという結論になってしまった。
Azkabanの不満
Project(ジョブのまとまり)の名前が英数字といくつかの記号でしか使えない。使い方がChinachuのエンコード管理なので、 Project名に「タイトル-日付」とかにしたい。
エンコードをずっとやっているとProjectがたまりまくって割りとうっとうしい。検索とかしやすくなると良いのだけど
要件
- フロー・ジョブの登録がシェルスクリプトなどからできる(recordedCommandで実行するので)
- ジョブの依存関係でDAGフローが作成できる
- フローの即時実行ができる
- フローの並列度を制御する
- できれば、登録したジョブ・フローの検索性が良いこと
調査結果
airflow
なんかAzkaban派だった人たちが移行しているらしいとのうわさをTwitterで見つけてチェックしてみた。 うーん、いまいち
- flowの実行制御ができていない?(ジョブ1個ずつ走らせないと動かないような)
- スケジュール実行(時間指定)がメインっぽいインターフェース
luigi
シンプルなんだけど、機能不足
Rundeck
割と良くできているように見えるけど、イマイチニーズに合わない。
- やっぱりスケジュール実行メインのインターフェース
- DAGのフローではなくステップ実行がメイン?
- タスク同時実行の並列度制御ができないらしい
結論
Azkabanでいいじゃん
おまけ
調べてる過程で見つけた、pythonのazkabanバインディングがまあまあ良い感じだった。 ごりごりと作るのはシェルスクリプトでやるのと似たようなものだけど、jobの一時ファイルを作らなくても良いとか、 pyファイル1個で全部実現できるとかメリットが色々ある。
ただ、日本語をコマンド内に記述すると上手くいかないため、Projectのpropertiesに入れる必要があった。 しかも、ただ入れただけじゃダメで、Javaの悪しき習慣である、native2ascii相当の処理をかけてやらないといけなかった。
で、native2ascii相当のことをするのに適当にpypi探して見つけたのがzerok/pyjavaproperties-unicode。 ただし、こいつもバグがあって、変換しなければいけないUnicode文字が複数続いていると落ちるとか・・・ さくっとPR書いたので、そのうち反映されるかな・・・
まあ、このソースを参考にencode_unicode()を書けば良いだけなんだけど。