web-dev-qa-db-fra.com

Apache Airflow DAG ne peut pas importer de module local

Je ne semble pas comprendre comment importer des modules dans un fichier de définition de DAG Apache. Je voudrais faire cela pour pouvoir créer une bibliothèque qui rend la déclaration de tâches avec des paramètres similaires moins détaillée, par exemple.

Voici l'exemple le plus simple que je puisse imaginer qui répète le problème: j'ai modifié le didacticiel de flux d'air ( https://airflow.Apache.org/tutorial.html#recap ) pour simplement importer un module et exécuter la définition ce module. Ainsi:

Structure du répertoire:

- dags/
-- __init__.py
-- lib.py
-- tutorial.py

tutorial.py:

"""
Code that goes along with the Airflow located at:
http://airflow.readthedocs.org/en/latest/tutorial.html
"""
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta

# Here is my added import
from lib import print_double

# And my usage of the imported def
print_double(2)

## -- snip, because this is just the tutorial code, 
## i.e., some standard DAG defintion stuff --

print_double est juste un simple def qui multiplie par 2 le nombre d'entrées que vous lui donnez et affiche le résultat, mais évidemment, cela n'a pas d'importance, car il s'agit d'un problème d'importation.

Je suis capable d'exécuter airflow test tutorial print_date 2015-06-01 conformément à la documentation du didacticiel - le dag s'exécute et, en outre, print_double réussit. 4 est imprimé sur la console, comme prévu. Tout semble bien.

Ensuite, je vais à l'interface Web, et je suis accueilli par Broken DAG: [/home/airflow/airflow/dags/tutorial.py] No module named 'lib'. Annulation de la pause et tentative d'exécution manuelle à l'aide de l'interface utilisateur provoquent l'état "en cours d'exécution", mais l'opération échoue ou échoue. Il est juste sur "courir" pour toujours. Je peux faire la queue autant que je le souhaite, mais ils resteront tous sur le statut "en cours d'exécution".

J'ai vérifié les journaux de flux d'air et je n'y trouve aucune information de débogage utile.

Alors qu'est-ce qui me manque?

7
fildred13

Utilisez-vous Airflow 1.9.0? Cela pourrait être corrigé ici.

Le problème provient de la manière dont Airflow charge les DAG: il ne les importe pas uniquement en tant que modules python normaux, car il souhaite pouvoir le recharger sans redémarrer les processus. En conséquence, . n'est pas dans le chemin de recherche python.

Si 1.9.0 ne résout pas le problème, le changement le plus simple consiste à insérer export PYTHONPATH=/home/airflow/airflow/:$PYTHONPATH dans les scripts de démarrage. Le format exact de cela dépendra de ce que vous utilisez (scripts systemd vs init, etc.)

4
Ash Berlin-Taylor

Ajouter le chemin sys a encore fonctionné pour moi,

import sys
sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(__file__))))
0
viru