web-dev-qa-db-fra.com

Impossible d'importer des plugins Airflow

Tutoriel suivant sur le flux d’air ici .

Problème: le serveur Web renvoie l'erreur suivante

Broken DAG: [/usr/local/airflow/dags/test_operator.py] cannot import name 
MyFirstOperator

Notes: La structure du répertoire ressemble à ceci:

airflow_home
├── airflow.cfg
├── airflow.db
├── dags
│   └── test_operators.py  
├── plugins
│   └── my_operators.py   
└── unittests.cfg

J'essaie d'importer le plugin dans 'test_operators.py' comme ceci:

from airflow.operators import MyFirstOperator

Le code est identique à ce que l'on trouve dans le tutoriel.

17

J'ai redémarré le serveur Web et maintenant tout fonctionne bien.

Voici ce que je pense aurait pu se passer:

  1. Avant de commencer avec l’exemple de didacticiel, j’ai essayé d’exécuter mon propre plugin et dag. Il y avait une erreur de syntaxe mineure lors de la première exécution que j'ai corrigée. Cependant, après le correctif, j'ai commencé à obtenir l'erreur «impossible d'importer le nom».
  2. J'ai supprimé le plugin et dag, et j'ai essayé d'utiliser celui du tutoriel pour voir ce qui se passait. 

Je suppose que l’erreur de l’étape 1 a en quelque sorte affecté l’étape 2.

3

Dans l'article, cela ressemble à ceci:

class MyFirstPlugin(AirflowPlugin):
    name = "my_first_plugin"
    operators = [MyFirstOperator]

Utilisez plutôt:

class MyFirstPlugin(AirflowPlugin):
    name = "my_first_plugin"
    operators = [MyFirstOperator]
    # A list of class(es) derived from BaseHook
    hooks = []
    # A list of class(es) derived from BaseExecutor
    executors = []
    # A list of references to inject into the macros namespace
    macros = []
    # A list of objects created from a class derived
    # from flask_admin.BaseView
    admin_views = []
    # A list of Blueprint object created from flask.Blueprint
    flask_blueprints = []
    # A list of menu links (flask_admin.base.MenuLink)
    menu_links = []

Aussi, n'utilisez pas:

from airflow.operators import MyFirstOperator

Selon l'article de flux d'air sur les plugins, il devrait être:

from airflow.operators.my_first_plugin import MyFirstOperator

Si cela ne fonctionne pas, essayez:

from airflow.operators.my_operators import MyFirstOperator

Si cela ne fonctionne pas, consultez le journal de votre serveur Web au démarrage pour plus d'informations.

3
jhnclvr

J'utilise airflow 1.10 . S'il s'agit d'un opérateur personnalisé que vous souhaitez importer, vous pouvez le télécharger dans le dossier des plug-ins de flux d'air, puis dans le DAG, spécifiez l'importation comme suit:

de [nom du fichier] import [nom de la classe]

où: filename est le nom de votre fichier de plugin classname est le nom de votre classe. 

Par exemple: Si le nom de votre fichier est my_first_plugin et le nom de la classe est MyFirstOperator , L'importation serait:

de my_first_plugin import MyFirstOperator

Travaillé pour moi car j'utilise airflow 1.10  

Merci ! J'espère que cela t'aides !!

1
Sneha K

Selon les docs -

Les modules python du dossier plugins sont importés et les points d'ancrage, opérateurs, capteurs, macros, exécuteurs et vues Web s'intègrent aux collections principales d'Airflow et deviennent disponibles.

et fonctionne bien dans la version 1.10.1

1
Sachin Kolige

J'ai dû mettre à jour le chemin du plugin dans le fichier airflow.cfg afin de résoudre le problème.

Où sont stockés vos plugins Airflow:

plugins_folder = /airflow/plugins
1

J'ai rencontré la même erreur en suivant ces tutoriels .

Cependant, ma faute était que j’avais utilisé le caractère espace ' ' dans task_id, qui n’est pas pris en charge par Airflow.

Clairement, l'erreur n'a pas indiqué le problème réel. Redémarrez à la fois les flux scheduler et webserver d'Airflow, puis affiche le message d'erreur correct sur WebUI.

1
y2k-shubham