气流笨拙和PYTHONPATH

时间:2018-06-06 02:58:14

标签: airflow airflow-scheduler

我有一些看似无法找到python模块的dag。在Airflow用户界面中,我看到了大量的消息变化。

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

这是EnvironentFile内容从上面使用

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

5 个答案:

答案 0 :(得分:1)

看起来你的python环境已经降级了 - 你的vm(python 3.6和python 2.7)上有多个python实例和pip的多个实例。有一个python3.6正在尝试使用,但你的所有模块实际上都是你的python 2.7。

使用符号链接重定向到2.7可以很容易地解决这个问题。

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

  1. python
  2. python2
  3. python2.7
  4. 或键入which python以查找vm正在使用的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
    4. 符号链接结构为:ln -s #PATHDIRECTED #LINKNAME 您实际上在说运行命令python时,请转到python2。然后运行python2时,转到/home/airflow/.local/lib/python2.7。它全部被重定向。

      现在重新运行上面的三个命令(python,python2,python2.7)。所有这些都应该导致你想要的python实例。

      希望这有帮助!

答案 1 :(得分:0)

我有类似的问题:

  1. 未从virtualenv加载Python来运行气流(未从virtualenv获取此固定的气流深度)
  2. 由于不同的基本路径,未加载在dags路径下的子模块(此固定的操作是在dags文件夹下导入自己的模块

我将以下字符串添加到用于systemd服务的environemnt文件中 (根据您的情况,{/usr/local/airflow/instances/airflow2/etc/envars

source /home/ubuntu/venv/airflow/bin/activate
PYTHONPATH=/home/ubuntu/venv/airflow/dags:$PYTHONPATH

答案 2 :(得分:0)

对不起,这个话题很老,但是我在作为守护程序启动气流方面有很多问题,我分享我的解决方案

首先,我在/ home / myuser / anaconda3中安装了anaconda,然后安装了我在dags中使用的所有库,然后创建了以下文件:

/etc/systemd/system/airflow-webserver.service
    [Unit]
    Description=Airflow webserver daemon
    After=network.target

    [Service]
    Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    RuntimeDirectory=airflow
    RuntimeDirectoryMode=0775
    User=myuser
    Group=myuser
    Type=simple
    ExecStart=/bin/bash -c 'source /home/myuser/anaconda3/bin/activate; airflow webserver -p 8080 --pid /home/myuser/airflow/webserver.pid'
    Restart=on-failure
    RestartSec=5s
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target

与守护程序调度程序相同

/etc/systemd/system/airflow-schedule.service

[Unit]
Description=Airflow schedule daemon
After=network.target
[Service]
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
RuntimeDirectory=airflow
RuntimeDirectoryMode=0775
User=goflex_lat
Group=goflex_lat
Type=simple
ExecStart=/bin/bash -c 'source /home/goflex_lat/anaconda3/bin/activate; airflow scheduler'
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
WantedBy=multi-user.target

systemclt的下一个exec命令:

sudo systemctl daemon-reload
sudo systemctl enable airflow-webserver.service
sudo systemctl enable airflow-schedule.service

sudo systemctl start airflow-webserver.service
sudo systemctl start airflow-schedule.service

答案 3 :(得分:0)

您可以将其直接添加到 Airflow Dockerfile 中,如下例所示。如果您有 .env 文件,您可以执行 ENV PYTHONPATH "${PYTHONPATH}:${AIRFLOW_HOME}"

FROM puckel/docker-airflow:1.10.6
RUN pip install --user psycopg2-binary
ENV AIRFLOW_HOME=/usr/local/airflow

# add persistent python path (for local imports)
ENV PYTHONPATH "/home/jovyan/work:${AIRFLOW_HOME}"

COPY ./airflow.cfg /usr/local/airflow/airflow.cfg
CMD ["airflow initdb"]

答案 4 :(得分:0)

当我尝试从 UI 触发 dag 时,我仍然遇到同样的问题(无法找到 python 本地模块,即 my_module.my_sub_module ... 等),但是当我测试时:

airflow test my_dag my_task  2021-04-01

效果很好!

我的 .bashrc 中也有一行(它应该在其中找到 python 本地模块):

export PYTHONPATH="/home/my_user"