web-dev-qa-db-de.com

Apache Airflow DAG kann kein lokales Modul importieren

Ich verstehe nicht, wie man Module in eine Apache Airflow DAG-Definitionsdatei importiert. Ich möchte dies tun, um eine Bibliothek erstellen zu können, die das Deklarieren von Aufgaben mit ähnlichen Einstellungen weniger ausführlich macht.

Hier ist das einfachste Beispiel, von dem ich mir vorstellen kann, dass das Problem repliziert wird: Ich habe das Airflow-Tutorial ( https://airflow.Apache.org/tutorial.html#recap ) so geändert, dass ein Modul importiert und eine Definition ausgeführt wird dieses Modul. So wie:

Verzeichnisaufbau:

- 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 ist nur ein einfaches def, das die eingegebenen Eingaben mit 2 multipliziert und das Ergebnis ausgibt. Dies spielt jedoch keine Rolle, da dies ein Importproblem ist.

Ich bin in der Lage, airflow test tutorial print_date 2015-06-01 wie in den Tutorial-Dokumenten erfolgreich auszuführen - das Dag wird ausgeführt, und außerdem ist das print_double erfolgreich. 4 wird erwartungsgemäß auf die Konsole gedruckt. Alles scheint gut zu sein.

Dann gehe ich zur Web-Benutzeroberfläche und werde von Broken DAG: [/home/airflow/airflow/dags/tutorial.py] No module named 'lib' begrüßt. Wenn Sie das dag nicht starten und einen manuellen Lauf über die Benutzeroberfläche versuchen, wird der Status "ausgeführt", aber es schlägt fehl oder schlägt fehl. Es sitzt einfach für immer "laufen". Ich kann so viele Schlange anstellen, wie ich möchte, aber sie sitzen alle im Status "Laufen".

Ich habe die Luftstromprotokolle geprüft und sehe dort keine nützlichen Debug-Informationen.

Was fehlt mir?

7
fildred13

Verwenden Sie Airflow 1.9.0? Dies könnte dort behoben werden.

Das Problem wird durch die Art und Weise verursacht, in der Airflow DAGs lädt: Sie importiert sie nicht nur als normale Python-Module, sondern möchte sie ohne Neustart von Prozessen erneut laden. Folglich ist . nicht im Python-Suchpfad.

Wenn 1.9.0 dies nicht behebt, besteht die einfachste Änderung darin, export PYTHONPATH=/home/airflow/airflow/:$PYTHONPATH in die Startskripts zu schreiben. Das genaue Format hängt davon ab, was Sie verwenden (systemd vs. init-Skripts usw.).

4

Das Hinzufügen des Sys-Pfads funktionierte wieder für mich.

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