气流版本:1.10.0
在之后,我创建了sensors
文件夹和my_sensor.py
,并添加了
[...]
from sensors.my_sensor import MySensor
[...]
wait_something = MySensor(task_id='taskA')
[...]
不幸的是,Airflow在尝试重新加载DAG时抱怨如下:
损坏的DAG:[/usr/local/airflow/dags/my_dag.py]没有名为“传感器”的模块
为了确定我也重新启动了服务器。
以下句子(来自上述指南)使我想知道我是否无法更新此PATH
变量,但是我在任何地方都找不到它,而且我一无所知:
Airflow运行时,会将dags /,plugins /和config /添加到PATH
PS:我不想使用Plugins
,该指南的重点是提供一种替代方法来使用{{1}加载自定义运算符/传感器/挂钩 而无需 }
答案 0 :(得分:1)
您参考的指南似乎不正确。 PATH
是环境变量,它列出了一组路径,这些路径会搜索诸如Python可执行文件grep
或vim
之类的可执行文件。 PYTHONPATH
是Python用于添加到其模块搜索路径的环境变量。 Airflow最有可能更新的是sys.path
,它是运行时的模块搜索路径,其中将包括Python的常规模块目录以及PYTHONPATH
的内容。 sys.path
特别有用,因为它在运行时是用户可变的。
要查看模块搜索路径的外观,可以将其添加到DAG的顶部:
import sys
print(sys.path)
即使损坏的DAG(如果该部分是脚本的第一部分),则print
的输出也将包含在Web服务器/调度程序的DAG解析日志中。您还可以通过运行以下命令来检查默认sys.path
,而无需更改任何气流:
# python3 -c 'import sys; print(sys.path)'
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/username/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']
现在,您可能无权将文件写入到/usr/local/lib/python3.8/dist-packages
之类的系统目录,也无法使用自定义PYTHONPATH
重新启动Airflow。但是,另一种选择是将自定义传感器放置在您确实具有写访问权的目录中,并在将该路径导入DAG中之前更新sys.path
。像这样:
import sys
sys.path.append("/some/arbitrary/path/plugins")
from sensors.my_sensor import MySensor
# ...do something with MySensor
答案 1 :(得分:0)
尝试这样的事情:
from airflow.sensors.sftp_sensor import SFTPSensor
where sftp_sensor is my name and sensor is SFTPSensor.
class SFTPSensorPlugin(AirflowPlugin):
name = "sftp_sensor"
sensors = [SFTPSensor]
答案 2 :(得分:0)
我只是遇到了同样的问题,结果是我没有将plugins文件夹安装到容器中。安装完成后,一切正常。