气流 dags 和 PYTHONPATH

seb*_*ian 5 airflow airflow-scheduler

我有一些 dags 似乎无法找到 python 模块。在 Airflow UI 内部,我看到了大量这些消息变化。

Broken DAG: [/home/airflow/source/airflow/dags/test.py] No module named 'paramiko'

在文件内部,我可以直接修改 python sys.path,这似乎减轻了我的问题。 import sys sys.path.append('/home/airflow/.local/lib/python2.7/site-packages')

尽管必须直接在我的代码中设置我的路径,但这感觉不对。我已经尝试在 Airflow 用户帐户 .bashrc 中导出 PYTHONPATH,但在执行 dag 作业时似乎没有被读取。解决这个问题的正确方法是什么?

谢谢。

- - - 更新 - - -

感谢您的回复。

下面是我的 systemctl 脚本。

::::::::::::::
airflow-scheduler-airflow2.service
::::::::::::::
[Unit]
Description=Airflow scheduler daemon

[Service]
EnvironmentFile=/usr/local/airflow/instances/airflow2/etc/envars
User=airflow2
Group=airflow2
Type=simple
ExecStart=/usr/local/airflow/instances/airflow2/venv/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
::::::::::::::
airflow-webserver-airflow2.service
::::::::::::::
[Unit]
Description=Airflow webserver daemon

[Service]
EnvironmentFile=/usr/local/airflow/instances/airflow2/etc/envars
User=airflow2
Group=airflow2
Type=simple
ExecStart=/usr/local/airflow/instances/airflow2/venv/bin/airflow webserver
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

这是 EnvironentFile Contents 从上面使用的

more /usr/local/airflow/instances/airflow2/etc/envars
PATH=/usr/local/airflow/instances/airflow2/venv/bin:/usr/local/bin:/usr/bin:/bin
AIRFLOW_HOME=/usr/local/airflow/instances/airflow2/home
AIRFLOW_CONFIG=/usr/local/airflow/instances/airflow2/etc/airflow.cfg
Run Code Online (Sandbox Code Playgroud)

Zac*_*ack 2

您的 python 环境似乎已降级 - 您的虚拟机上有多个 python 实例(python 3.6 和 python 2.7)以及多个 pip 实例。有一个 python3.6 的 pip 正在尝试使用,但您的所有模块实际上都在 python 2.7 中。

通过使用符号链接重定向到 2.7 可以轻松解决此问题。

输入命令并查看使用的是哪个 python 实例(2.7.5、2.7.14、3.6 等):

  1. python
  2. python2
  3. python2.7

或键入which python查找您的虚拟机正在使用哪个 python 实例。您还可以which pip查看正在使用什么 pip 实例。

我将假设pythonwhich python导致 python 3(您不想使用它),但python2python2.7导致您确实想要使用的实例。

要创建符号链接以便/home/airflow/.local/lib/python2.7/使用,请执行以下操作并创建以下符号链接:

  1. cd home/airflow/.local/lib/python2.7
  2. ln -s python2 python
  3. ln -s /home/airflow/.local/lib/python2.7 python2

符号链接结构是:ln -s #PATHDIRECTED #LINKNAME 您实质上是在说,当您运行命令时python,转到python2。然后运行时python2,转到/home/airflow/.local/lib/python2.7. 一切都被重定向了。

现在重新运行上面的三个命令(python、python2、python2.7)。所有这些都应该指向您想要的 python 实例。

希望这可以帮助!