Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Airflow Can';导入气流插件_Airflow - Fatal编程技术网

Airflow Can';导入气流插件

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

下面是气流教程

问题: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   
└── 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服务器,现在一切正常

以下是我认为可能发生的情况:

  • 在开始教程示例之前,我尝试运行自己的插件和dag。在我修复的第一次运行中出现了一个小的语法错误,但是在修复之后,我开始出现“无法导入名称”错误
  • 我删除了插件和dag,并尝试使用教程中的插件来查看发生了什么
    我的猜测是,步骤1中的错误以某种方式影响了步骤2。

    我在执行以下操作时遇到了相同的错误

    然而,我的错误是,我在
    任务id
    中使用了空格字符
    '
    ,这是
    不支持的


    很明显,错误并不指向实际问题。重新启动Airflow
    scheduler
    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