在Airflow中编写和导入自定义插件

在Airflow中编写和导入自定义插件,airflow,Airflow,这实际上是两个问题合在一起 我家的结构如下 airflow +-- dags +-- plugins +-- __init__.py +-- hooks +-- __init__.py +-- my_hook.py +-- another_hook.py +-- operators +-- __init__.py +-- my_operator.py +-- another_o

这实际上是两个问题合在一起

我家的结构如下

airflow
+-- dags
+-- plugins
    +-- __init__.py
    +-- hooks
        +-- __init__.py
        +-- my_hook.py
        +-- another_hook.py
    +-- operators
        +-- __init__.py
        +-- my_operator.py
        +-- another_operator.py
    +-- sensors
    +-- utils
我一直在关注天文学家伊奥的例子。我的自定义
操作符
使用我的自定义
挂钩
,所有导入都与顶级文件夹
插件
相关

#my_operator.py
从plugins.hooks.my_hook导入MyHook
但是,当我尝试将整个存储库移动到plugins文件夹中时,在运行
气流列表_dags
后出现导入错误,表示找不到
插件

我读了一些关于它的资料,很明显,Airflow将插件加载到它的核心模块中,这样它们就可以像

#my_operator.py
从afflow.hooks.my_hook导入MyHook
因此,我将所有导入内容改为直接从
aiffort.plugin\u type
读取。不过,我收到了另一个导入错误,这次是说找不到
我的\u hook
。我每次都重新启动workers、scheduler和Web服务器,但这似乎不是问题所在。我看过类似问题中提出的解决方案,但它们也不起作用

官方文档也展示了这种扩展
AirflowPlugin
类的方法,但我不确定这个“接口”应该驻留在哪里。我还更喜欢拖放选项


最后,显然,我的代码repo本身就是
plugins
文件夹是没有意义的,但是如果我将它们分开,测试就会变得不方便。每次在挂钩/操作上运行单元测试时,是否必须修改气流配置以指向回购协议?测试自定义插件的最佳实践是什么?

我通过反复尝试找到了答案。这是我的
主页
文件夹的最终结构

airflow 
+-- dags 
+-- plugins
    +-- __init__.py
    +-- plugin_name.py
    +-- hooks
        +-- __init__.py
        +-- my_hook.py 
        +-- another_hook.py 
    +-- operators
        +-- __init__.py
        +-- my_operator.py 
        +-- another_operator.py 
    +-- sensors 
    +-- utils
plugin\u name.py
中,我扩展了
AirflowPlugin

#plugin_name.py
从airflow.plugins\u管理器导入AirflowPlugin
从hooks.my_hook导入*
从operators.my_operator导入*
从utils.my_utils导入*
#等
类PluginName(AirflowPlugin):
名称='插件名称'
hooks=[MyHook]
运算符=[MyOperator]
宏=[my_util_func]
在使用自定义挂钩的自定义操作符中,我像

#my_operator.py
从hooks.my_hook导入MyHook
然后在我的DAG文件中,我可以

#sample_dag.py
从afflow.operators.plugin_name导入MyOperator
必须重新启动Web服务器和调度程序。我花了一段时间才弄明白


这也有助于测试,因为自定义类中的导入是相对于文件夹
plugins
中的子模块的。我想知道我是否可以省略
插件中的
\uuuu init\uuuuuupy
文件,但由于一切正常,我没有尝试这样做。

当我看到你自己的回复时,我说:尤里卡!但是没有。。。在您的步骤之后仍然存在问题。这里是我的SO问题(之后我尝试您的解决方案)。我能得到你的帮助吗?plugin_name.py的代码中有一个输入错误(至少对于当前版本的气流)。它应该来自airflow.pluginS\u managerI get“breaked DAG:[/opt/airflow/dags/my_DAG.py]没有名为'airflow.hooks.my_plugin'”的模块@Julio如果你用自己的设置和文件夹结构开始一个单独的问题,可能会更有帮助。