
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 .service
Datei 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)
ExecStart
erfordert 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.sh
dass 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
enable
undrestart
Optionen 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.sh
mit 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