Airflow Can';导入气流插件
下面是气流教程 问题:Web服务器返回以下错误Airflow Can';导入气流插件,airflow,Airflow,下面是气流教程 问题:Web服务器返回以下错误 Broken DAG: [/usr/local/airflow/dags/test_operator.py] cannot import name MyFirstOperator 注意事项: 目录结构如下所示: airflow_home ├── airflow.cfg ├── airflow.db ├── dags │ └── test_operators.py ├── plugins │ └── my_operators.py
Broken DAG: [/usr/local/airflow/dags/test_operator.py] cannot import name
MyFirstOperator
注意事项:
目录结构如下所示:
airflow_home
├── airflow.cfg
├── airflow.db
├── dags
│ └── test_operators.py
├── plugins
│ └── my_operators.py
└── unittests.cfg
from airflow.operators import MyFirstOperator
我正试图在“test_operators.py”中导入插件,如下所示:
airflow_home
├── airflow.cfg
├── airflow.db
├── dags
│ └── test_operators.py
├── plugins
│ └── my_operators.py
└── unittests.cfg
from airflow.operators import MyFirstOperator
代码与教程中的代码完全相同。在文章中,它是这样做的:
airflow_home
├── airflow.cfg
├── airflow.db
├── dags
│ └── test_operators.py
├── plugins
│ └── my_operators.py
└── unittests.cfg
from airflow.operators import MyFirstOperator
class MyFirstPlugin(AirflowPlugin):
name=“我的第一个插件”
运算符=[MyFirstOperator]
而是使用:
class MyFirstPlugin(AirflowPlugin):
name=“我的第一个插件”
运算符=[MyFirstOperator]
#从BaseHook派生的类的列表
挂钩=[]
#从BaseExecutor派生的类的列表
执行人=[]
#要注入宏命名空间的引用列表
宏=[]
#从派生类创建的对象列表
#来自flask_admin.BaseView
管理员视图=[]
#从flask.Blueprint创建的Blueprint对象列表
flask_蓝图=[]
#菜单链接列表(flask_admin.base.MenuLink)
菜单链接=[]
也不要使用:
从afflow.operators导入MyFirstOperator
来自afflow.operators.my_first_插件导入MyFirstOperator
如果不起作用,请尝试:
来自afflow.operators.my_operators导入MyFirstOperator
如果不起作用,请在启动时查看web服务器日志以了解更多信息。我重新启动了web服务器,现在一切正常 以下是我认为可能发生的情况:
我的猜测是,步骤1中的错误以某种方式影响了步骤2。我在执行以下操作时遇到了相同的错误 然而,我的错误是,我在
任务id
中使用了空格字符'
,这是不支持的
很明显,错误并不指向实际问题。重新启动Airflowscheduler
和webserver
,然后在WebUI上显示正确的错误消息。我必须更新文件Airflow.cfg
中的插件路径才能解决问题
气流插件的存储位置:
plugins_folder = /airflow/plugins
根据文件-
插件文件夹中的python模块被导入,钩子、操作符、传感器、宏、执行器和web视图被集成到Airflow的主要集合中并可供使用
在1.10.1版中运行良好,我使用气流1.10。
如果要导入的是自定义操作符,可以将其上载到airflow plugins文件夹,然后在DAG中指定导入为:
从[filename]导入[classname]
其中:
filename是插件文件的名称
classname是您的类的名称
例如:
如果文件名为my_first_plugin,类名为MyFirstOperator
那么,进口将是:
从myfirst\u插件导入MyFirstOperator
在我使用气流1.10时为我工作
谢谢!希望这有帮助 在我的例子中,我通过以下步骤创建了一个自定义操作符:
气流10.3
在DAG文件中,从airflow.operators导入MacrosPostgresOperator
在~/afflow/plugins文件夹中,我有一个python文件custom_operator.py
,代码非常简单
从airflow.plugins\u管理器导入AirflowPlugin
从airflow.operators.postgres_operator导入PostgresOperator
类宏PostgresOperator(PostgresOperator):
模板_字段=('sql','parameters')
类MacrosFirstPlugin(AirflowPlugin):
name=“宏\u第一个\u插件”
运算符=[MacrosPostgresOperator]
您必须停止(CTRL-C)并重新启动Airflow web服务器和计划程序。在努力阅读Airflow文档并尝试此处的一些答案但未成功后,我发现
正如他们指出的,构建一个Airflow插件可能会让人困惑,而且可能不是未来添加挂钩和操作符的最佳方式
定制挂钩和操作器是扩展气流以满足您需求的强大方式。然而,在解决这一问题的最佳方法上存在一些困惑
实施它们。根据气流文件,它们可以
添加使用气流的插件机制。然而,这一点过于复杂
这一问题给许多人带来了困惑。气流均匀
考虑不推荐使用钩子和插件机制
运营商继续前进
所以,我没有使用插件API,而是按照天文学家的方法设置气流,如下所示
dags
└── my_dag.py (contains dag and tasks)
plugins
├── __init__.py
├── hooks
│ ├── __init__.py
│ └── mytest_hook.py (contains class MyTestHook)
└── operators
├── __init__.py
└── mytest_operator.py (contains class MyTestOperator)
通过这种方法,我的操作符和钩子的所有代码都完全存在于各自的文件中,并且没有令人困惑的插件文件。所有的\uuuuu init\uuuuuuuuuu.py
文件都是空的(不同于将插件代码放入其中一些文件的一些同样令人困惑的方法)
对于<代码>导入< /Cord>s,请考虑AurFLUP如何实际使用插件目录:
当气流运行时,它将向路径添加DAG/、插件/、配置/
这意味着从airflow.operators.mytest\u operator导入MyTestOperator
执行可能不起作用。
相反,从operators.mytest\u operator import MyTestOperator
是一种方法(请注意,在上面的设置中,从directory/file.py import Class到的对齐方式)
我的文件中的工作代码段如下所示
my_dag.py:
from airflow import DAG
from operators.mytest_operator import MyTestOperator
default_args = {....}
dag = DAG(....)
....
mytask = MyTestOperator(task_id='MyTest Task', dag=dag)
....
my_operator.py:
from airflow.models import BaseOperator
from hooks.mytest_hook import MyTestHook
class MyTestOperator(BaseOperator):
....
hook = MyTestHook(....)
....
my_hook.py:
class MyTestHook():
....
这对我来说很有效,而且非常有用
from airflow.operators.my_first_plugin import MyFirstOperator