2017-12-27 14 views
0

Ich verstehe anscheinend nicht, wie man Module in eine Apache Airflow DAG Definitionsdatei importiert. Ich möchte dies tun, um eine Bibliothek erstellen zu können, die zum Beispiel Aufgaben mit ähnlichen Einstellungen weniger ausführlich erklärt.Apache Airflow DAG kann kein lokales Modul importieren

Hier ist das einfachste Beispiel, das ich mir vorstellen kann, das das Problem repliziert: Ich änderte das Luftstrom-Tutorial (https://airflow.apache.org/tutorial.html#recap), um einfach ein Modul zu importieren und eine Definition von diesem Modul auszuführen. Wie so:

Verzeichnisstruktur:

- 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 eine einfache def die vervielfacht, was Eingang geben Sie es mit 2, und druckt das Ergebnis, aber Das spielt natürlich keine Rolle, denn dies ist ein Importproblem.

Ich bin in der Lage, airflow test tutorial print_date 2015-06-01 wie in der Anleitung docs erfolgreich ausgeführt - der dag läuft, und darüber hinaus ist der print_double erfolgreich. 4 wird wie erwartet auf die Konsole gedruckt. Alles erscheint gut.

Dann gehe ich die Web-UI, und werde von Broken DAG: [/home/airflow/airflow/dags/tutorial.py] No module named 'lib' begrüßt. Das Deaktivieren der Zeitmarke und das Ausführen eines manuellen Laufs mithilfe der Benutzeroberfläche führt zu einem Status "ausgeführt", der jedoch nie erfolgreich ist oder fehlschlägt. Es sitzt einfach auf "rennt" für immer. Ich kann so viele anstellen, wie ich möchte, aber sie sitzen alle nur im "Running" -Status.

Ich habe die Luftstrom-Protokolle überprüft und sehe dort keine nützlichen Debug-Informationen.

Was bin ich dabei?

+0

getestet in meinem lokalen und es funktionierte; Bist du sicher, dass du die Dateien im richtigen Verzeichnis hast? Könntest du eine tutorial.py-Datei bearbeiten, die sich nicht wirklich im dag-Ordner befindet? der weg sieht zwielichtig aus mit den zwei "luftströmungen" da: '/ home/luftstrom/luftstrom/dags/tutorial.py' – listik

+0

ich habe den kontext von diesem problem abgeschaltet, aber ich werde versuchen einen total frischen luftstrom einzubauen a vm und versuchen, wieder zu replizieren, wenn ich eine Chance bekomme. Allerdings kann ich bestätigen, dass "airflow" der Benutzername ist und "airflow/airflow" ist das Installationsverzeichnis, also ist zumindest dieser Teil nicht das Problem. Ich kann auch nur durch 'cd' in das Verzeichnis bestätigen, dass die Verzeichnisstruktur wie in der Frage gepostet wird. Aber ich werde meine Due Diligence machen und das Ganze in einer isolierten Umgebung nachbilden, da Sie sagen, dass es für Sie funktioniert. – fildred13

Antwort

0

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

Das Problem wird durch die Art verursacht, wie Airflow DAGs lädt: Sie importiert sie nicht nur als normale Python-Module, weil sie es neu laden wollen, ohne Prozesse neu zu starten. Daher befindet sich . nicht im Python-Suchpfad.

Wenn 1.9.0 das nicht behebt, ist die einfachste Änderung export PYTHONPATH=/home/airflow/airflow/:$PYTHONPATH in den Startskripten zu setzen. Das genaue Format davon hängt davon ab, was Sie verwenden (Systemd vs Init-Skripte usw.)

+0

Der Kontext hat sich im Moment aus dem Zusammenhang gedreht - werde diese Antwort so schnell wie möglich untersuchen! – fildred13

+0

Ich habe das gleiche Problem noch irgendwelche Korrekturen? – moku

Verwandte Themen