【问题标题】:Apache Airflow DAG cannot import local moduleApache Airflow DAG 无法导入本地模块
【发布时间】:2017-12-27 20:55:35
【问题描述】:

我似乎不明白如何将模块导入 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 只是一个简单的 def,它将您提供的任何输入乘以 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 手动运行会导致“正在运行”状态,但它永远不会成功或失败。它只是永远“运行”。我可以随心所欲地排队,但他们都只是处于“运行”状态。

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

那么我错过了什么?

【问题讨论】:

  • 在我的本地测试过它并且有效;你确定你有正确的目录中的文件吗?你能编辑一个不在 dag 文件夹中的 tutorial.py 文件吗?路径看起来很狡猾,有两个“气流”:/home/airflow/airflow/dags/tutorial.py
  • 我已经关闭了这个问题的上下文,但我会尝试在虚拟机中安装全新的气流,并在有机会时尝试再次复制。但是我可以确认airflow 是用户名,airflow/airflow 是安装目录,所以至少那部分不是问题。我也可以通过cding 确认目录结构与问题中发布的一样。但我会尽我所能,在一个孤立的环境中复制整个事情,因为你说它对你有用。

标签: python airflow apache-airflow


【解决方案1】:

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

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

【讨论】:

  • 为什么使用join()?这对我有用: import sys sys.path.insert(0,os.path.abspath(os.path.dirname(file)))
  • @alltej dag 文件本身,我想。以前为我工作过,虽然我现在看到一些奇怪的东西正在尝试另一个 dag (stackoverflow.com/q/58423137/8236733)
  • 是的 - 这在 DAG Python 文件中。为我工作到一天。
  • 我们已经停止使用气流,所以我无法验证这些答案中的任何一个。经过这么长时间后,根据对此的赞成票数量,我将接受它作为正确答案。
  • 如果你不喜欢把import sys; sys.path.insert(0,os.path.abspath(os.path.dirname(__file__)))放到你的dag模块中,你可以扩展PYTHONPATH环境变量,返回值为os.path.abspath(os.path.dirname(__file__))。就我而言,使用 apache-airflow 和 docker,我将以下内容放入我的 Dockerfile:ENV PYTHONPATH "${PYTHONPATH}:blablabla:/opt/project"。显然,我的自定义 dag-helper 模块位于气流容器内的/opt/project。扩展 PYTHONPATH 使 python 现在也在 /opt/project 查找我的自定义模块,每当我导入 sth
【解决方案2】:

您使用的是 Airflow 1.9.0 吗?这可能会在那里修复。

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

如果 1.9.0 没有解决这个问题,最简单的更改是将export PYTHONPATH=/home/airflow/airflow/:$PYTHONPATH 放在启动脚本中。其确切格式取决于您使用的内容(systemd vs init 脚本等)

【讨论】:

  • 上下文暂时退出这个 - 我会尽快调查这个答案!
  • 我也遇到了同样的问题,有解决办法了吗?
  • @AshBerlin-Taylor 这似乎仍然是 1.10.2 的问题。
  • 导出PYTHONPATH 也不起作用。我正在使用 1.10.2
  • 还有其他解决方法吗?该问题在 1.10.10 版本中仍然存在
【解决方案3】:

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

【讨论】:

  • 我正在使用 Airflow 的 Helm 图表,我遇到了这个问题,也许有办法克服它?
  • 看起来他们在这个 PR 中修复了它:github.com/apache/airflow/pull/16339 所以这是一个时间问题,所以这是一个新的 Helm 版本
【解决方案4】:

只需将您的本地模块放在气流插件文件夹中,它就会开始工作。 要知道您的气流插件使用命令的位置: 气流信息

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2018-10-13
  • 2021-12-08
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 2020-07-14
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多