我有一些看似无法找到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
答案 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等):
python
python2
python2.7
或键入which python
以查找vm正在使用的python实例。您也可以which pip
查看正在使用的pip实例。
我将假设python
和which python
导致python 3(您不想使用它),但python2
和python2.7
会导致您的实例我想用。
要创建符号链接以便使用/home/airflow/.local/lib/python2.7/
,请执行以下操作并创建以下符号链接:
cd home/airflow/.local/lib/python2.7
ln -s python2 python
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实例。
希望这有帮助!
答案 1 :(得分:0)
我有类似的问题:
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"