Verwenden von systemd zum Ausführen von Airflow in einer Conda-Umgebung

Verwenden von systemd zum Ausführen von Airflow in einer Conda-Umgebung

Ich habe einen Airflow-Server konfiguriert, der in einer Conda-Umgebung installiert ist, um einige geplante Automatisierungen auszuführen. Derzeit starte ich den Scheduler, die Worker und den Webserver direkt mit nohup, aber ich würde gerne systemd verwenden, um es robuster zu verwalten.

Ich habe jedoch Probleme, das System mit zu starten systemctl start. Ich habe meiner .serviceDatei Folgendes hinzugefügt:

ExecStartPre=. /etc/profile ; /home/shared/miniconda2/bin/conda activate airflow
ExecStart=/home/shared/miniconda2/envs/airflow/bin/airflow webserver --pid /run/airflow/webserver.pid

(wobei shared/es sich nicht um einen Benutzer handelt, sondern nur um einen Ordner darin, /home/auf den alle Benutzer Zugriff haben)

ExecStarterfordert airflow, dass die Conda-Umgebung aktiviert wird, in der Airflow tatsächlich installiert ist. Dazu habe ich die beiden in gezeigten Befehle hinzugefügt ExecStartPre: Der zweite aktiviert tatsächlich diese Umgebung. Wenn Sie dies allein ausführen, wird zurückgegeben CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'., daher habe ich den ersten hinzugefügt, um sicherzustellen, /etc/profile.d/conda.shdass geladen wird.

Dies schlägt jedoch immer noch fehl, anscheinend beim Versuch, den Gunicorn-Server auszuführen:

Running the Gunicorn Server with:
Workers: 4 sync
Host: 0.0.0.0:8080
Timeout: 120
Logfiles: - -
=================================================================
Traceback (most recent call last):
  File "/home/shared/miniconda2/envs/airflow/bin/airflow", line 28, in <module>
    args.func(args)
  File "/home/shared/miniconda2/envs/airflow/lib/python2.7/site-packages/airflow/bin/cli.py", line 844, in webserver
    gunicorn_master_proc = subprocess.Popen(run_args)
  File "/home/shared/miniconda2/envs/airflow/lib/python2.7/subprocess.py", line 390, in __init__
    errread, errwrite)
  File "/home/shared/miniconda2/envs/airflow/lib/python2.7/subprocess.py", line 1025, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

(Zeitstempel weggelassen, um die Lesbarkeit etwas zu verbessern)

Dies wirft eine Reihe von Fragen auf:

  • Was könnte die Ursache für den Ausfall meines Dienstes sein?
  • Ist mein Setup unsinnig (systemd + conda + airflow)?
  • Wenn es unsinnig ist, gibt es dann eine bessere Möglichkeit, Airflow robuster auszuführen, als es direkt zu starten? Mich haben insbesondere die enableund restartOptionen interessiert, die systemd bietet.

Antwort1

Ich hoffe, Sie haben Ihr Problem inzwischen gelöst, aber hier ist meine Lösung als Referenz.

Ich habe das Problem gelöst, indem ich eine Indirektionsebene zum Starten des Luftstroms hinzugefügt habe. Ich habe beispielsweise ein Bash-Skript airflow_runner.shmit folgendem

conda activate airflow-env
$AIRFLOW_BIN/airflow $@

Dann in meiner systemd-Unit-Datei

ExecStart=PATH_TO_SCRIPT/airflow_runner.sh webserver --pid /run/airflow/webserver.pid

verwandte Informationen