Apache Airflow中的自定义传感器

时间:2019-06-19 13:30:28

标签: airflow

气流版本:1.10.0

enter image description here之后,我创建了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}加载自定义运算符/传感器/挂钩 而无需 }

3 个答案:

答案 0 :(得分:1)

您参考的指南似乎不正确。 PATH是环境变量,它列出了一组路径,这些路径会搜索诸如Python可执行文件grepvim之类的可执行文件。 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文件夹安装到容器中。安装完成后,一切正常。