Airflow と格闘中
背景
luigi と airflow の使い勝手を比較したい。 現在は Makefile で ruby のワンライナーで日付を生成して xargs で make を呼んだりしている。
作業
luigi
airflow と比べるとすんなりできた。
airflow
以下にハマったところを書く。
自動生成されたファイルのコメントを読め!
initdb
コマンドで作成される、airflow.cfg
ファイル中の、dags_folder
と、base_log_folder
が絶対パス指定する必要があったこと。
これは、その設定ファイル中のコメントに
# This path must be absolute
と書かれているだけで、ドキュメントには特に何も書かれていない。
自動生成するならそのあたり自動で絶対パスにするか、エラーにするか、警告が欲しいところ。それにドキュメントにも書くべきじゃない?
ちなみにこれを書かなくても、test
コマンドなどは通るが(ここが曲者)、run, backfill
は通らない。
解決方法は、AIRFLOW_HOME
に絶対パス指定して、initdb
コマンドを実行すれば、airflow.cfg
中の設定値は絶対パスとなる。
run
は内部で使うコマンドだよ?
run
は確かにチュートリアルにも出てこないけど、test
はログに何も表示されないし、タスクの依存の検証とか、同時実行や重複実行の回避の検証には使えない。backfill
は全タクス実行なので、検証としてはでかすぎる。だから run
を使いたい。
しかし、run
コマンドを使うと、再びrun
を実行するexecutor
を呼び出すようになっている。何言っているか分からないと思うが、 run
コマンドを実行すると、内部でもう一度 run
コマンドを実行するようになっている。
それも Makefile のように、依存関係のあるタスクに対して芋づる式には実行されない。ただし、依存関係のあるタスクが成功していないと失敗となる。
*失敗*:タスクは「成功」状態にあり実行すべき状態でない (exit 0)
以下の超意訳:
'Task Instance State' FAILED: Task is in the 'success' state which is not a valid state for execution. ... INFO - Task exited with return code 0
失敗なのか成功なのか始め分からなかった。「既にタスク実行済みでタスクを実行しない」という意味っぽい。
ログはタスク×日付時刻毎にファイルを分けて出力する!
流れが追いにくい…。
今日はここまで。