Apache Airflow DAG无法导入本地模块

时间:2017-12-27 20:55:36

标签: python airflow apache-airflow

我似乎不明白如何将模块导入apache airflow 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只是一个简单的def,它将您给出的任何输入乘以2,并打印结果,但显然这并不重要,因为这是一个导入问题。

我能够按照教程文档成功运行airflow test tutorial print_date 2015-06-01 - dag运行,而且print_double成功。正如预期的那样,4将打印到控制台。一切都很好。

然后我进入了网络用户界面,受到了Broken DAG: [/home/airflow/airflow/dags/tutorial.py] No module named 'lib'的欢迎。取消暂停dag并尝试使用UI进行手动运行会导致"运行"状态,但它永远不会成功或失败。它只是坐在"运行"永远。我可以和我一样多排队,但他们只是坐在"跑步"状态。

我检查了气流日志,并且没有看到任何有用的调试信息。

那么我错过了什么?

3 个答案:

答案 0 :(得分:5)

您使用的是Airflow 1.9.0吗?这可能是固定的。

问题是由Airflow加载DAG的方式引起的:它不只是将它们导入为普通的python模块,因为它希望能够在不重新启动进程的情况下重新加载它。因此.不在python搜索路径中。

如果1.9.0无法解决此问题,最简单的更改是将export PYTHONPATH=/home/airflow/airflow/:$PYTHONPATH放入启动脚本中。确切的格式取决于您使用的是什么(systemd vs init scripts等)

答案 1 :(得分:0)

再次添加sys路径对我有用,

import sys
sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(__file__))))

答案 2 :(得分:0)

如果您正在使用git-sync并且没有在kubernetes中用作initContainer(仅用作容器或根本不用作容器),则可能是模块未加载到Web服务器或调度程序中。 / p>