モジュールをApacheエアフローDAG定義ファイルにインポートする方法を理解していないようです。たとえば、同様の設定でタスクを宣言することで冗長性を低くするライブラリを作成できるようにするために、これを行いたいと思います。
以下は、問題を再現する最も簡単な例です。気流チュートリアル( https://airflow.Apache.org/tutorial.html#recap )を修正して、モジュールをインポートして実行するだけです。そのモジュールからの定義。そのようです:
ディレクトリ構造:
- dags/
-- __init__.py
-- lib.py
-- tutorial.py
tutorial.py:
"""
Code that goes along with the Airflow located at:
http://airflow.readthedocs.org/en/latest/tutorial.html
"""
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
# Here is my added import
from lib import print_double
# And my usage of the imported def
print_double(2)
## -- snip, because this is just the tutorial code,
## i.e., some standard DAG defintion stuff --
print_double
は単純な定義であり、入力に2を掛けて結果を出力しますが、これはインポートの問題であるため明らかに問題ではありません。
チュートリアルのドキュメントに従ってairflow test tutorial print_date 2015-06-01
を正常に実行できます-dagが実行され、さらにprint_doubleが成功します。 4
は期待どおりにコンソールに出力されます。すべてがうまく表示されます。
次に、Web UIにアクセスすると、Broken DAG: [/home/airflow/airflow/dags/tutorial.py] No module named 'lib'
が表示されます。 DAGの一時停止を解除し、UIを使用して手動で実行しようとすると「実行中」ステータスになりますが、成功または失敗することはありません。それはただ「実行中」にとどまります。私は好きなだけキューに入れることができますが、それらはすべて「実行中」ステータスに座っています。
エアフローログを確認しましたが、有用なデバッグ情報が表示されません。
だから私は何が欠けていますか?
Airflow 1.9.0を使用していますか?これはそこで修正されるかもしれません。
この問題は、AirflowがDAGを読み込む方法が原因で発生します。通常のpythonモジュールとしてインポートするだけではありません。プロセスを再起動せずに再読み込みできるようにするためです。その結果.
はpython検索パスにありません。
1.9.0でこれが修正されない場合、最も簡単な変更はexport PYTHONPATH=/home/airflow/airflow/:$PYTHONPATH
起動スクリプト内。正確な形式は、使用しているものによって異なります(systemdとinitスクリプトなど)。
Sysパスを再度追加するとうまくいきました。
import sys
sys.path.insert(0,os.path.abspath(os.path.dirname(__file__)))