中野智文のブログ

データ・マエショリスト(※データ・マエストロではない)のメモ

Airflow と格闘中

背景

luigi と airflow の使い勝手を比較したい。 現在は Makefilerubyワンライナーで日付を生成して 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

失敗なのか成功なのか始め分からなかった。「既にタスク実行済みでタスクを実行しない」という意味っぽい。

ログはタスク×日付時刻毎にファイルを分けて出力する!

流れが追いにくい…。

今日はここまで。

つづきは、 nakano-tomofumi.hatenablog.com