Usando systemd para ejecutar el flujo de aire dentro del entorno conda

3

Configuré un servidor Airflow instalado dentro de un entorno conda para ejecutar algunas automatizaciones programadas. Actualmente, lanzo el planificador, los trabajadores y el servidor web directamente usando nohup, pero me gustaría usar systemd para administrarlo de manera más robusta.

Sin embargo, tengo problemas para iniciar el sistema con systemctl start. Agregué a mi .servicearchivo lo siguiente:

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

(donde shared/no hay un usuario, solo una carpeta dentro /home/de la cual todos los usuarios tienen acceso)

ExecStartrequiere que se airflowactive el entorno conda en el que el flujo de aire está realmente instalado. Para hacer esto, agregué los dos comandos vistos en ExecStartPre: el segundo realmente activa este entorno. Ejecutar esto solo regresa CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'., así que agregué el primero para asegurarme de que /etc/profile.d/conda.shesté cargado.

Sin embargo, esto todavía falla, aparentemente al intentar ejecutar el servidor Gunicorn:

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

(se omiten las marcas de tiempo para mejorar un poco la legibilidad)

Esto plantea una serie de preguntas:

  • ¿Qué puede estar causando que mi servicio falle?
  • ¿Mi configuración no tiene sentido (systemd + conda + flujo de aire)?
  • Si no tiene sentido, ¿hay una mejor manera de ejecutar el flujo de aire de manera más sólida que lanzarlo directamente? Estaba particularmente interesado en las opciones enabley restartque ofrece systemd.
kadu
fuente

Respuestas:

1

Espero que ya haya resuelto su problema, pero para referencia aquí es mi solución.

La forma en que lo resolví fue agregar un nivel de indirección para iniciar el flujo de aire. Tengo un script bash, por ejemplo, airflow_runner.shcon lo siguiente

conda activate airflow-env
$AIRFLOW_BIN/airflow $@

Luego en mi archivo de unidad systemd

ExecStart=PATH_TO_SCRIPT/airflow_runner.sh webserver --pid /run/airflow/webserver.pid
Antonis Kouzoupis
fuente
Gracias por su respuesta. Acabo de pasar a una implementación de Docker de Airflow, que eliminó los problemas que estaba teniendo. De todos modos, tomaré tu palabra de que funciona y lo aceptaré. Bienvenido a SuperUser.
kadu