J'ai une instance EC2 qui exécute airflow 1.8.0 en utilisant LocalExecutor
. D'après les documents, je m'attendais à ce que l'une des deux commandes suivantes ait déclenché l'ordonnanceur en mode démon:
airflow scheduler --daemon --num_runs=20
ou
airflow scheduler --daemon=True --num_runs=5
Mais ce n'est pas le cas. La première commande semble fonctionner, mais elle renvoie simplement la sortie suivante avant de retourner au terminal sans produire de tâche d'arrière-plan:
[2017-09-28 18:15:02,794] {__init__.py:57} INFO - Using executor LocalExecutor
[2017-09-28 18:15:03,064] {driver.py:120} INFO - Generating grammar tables from /usr/lib/python3.5/lib2to3/Grammar.txt
[2017-09-28 18:15:03,203] {driver.py:120} INFO - Generating grammar tables from /usr/lib/python3.5/lib2to3/PatternGrammar.txt
La deuxième commande produit l'erreur:
airflow scheduler: error: argument -D/--daemon: ignored explicit argument 'True'
Ce qui est étrange, car selon les docs--daemon=True
doit être un argument valide pour le airflow scheduler
appel.
Creuser un peu plus profondément m'a amené à ce post StackOverflow , où l'une des réponses recommande une implémentation de systemd
pour gérer le planificateur de flux d'air comme un processus d'arrière-plan selon le code disponible en tant que - ce dépôt .
Mes adaptations légèrement modifiées du script sont publiées comme les Gists suivants. J'utilise une instance EC2 Vanilla m4.xlarge avec Ubuntu 16.04.3:
De là, j'appelle:
Sudo systemctl enable airflow-scheduler
Sudo systemctl start airflow-scheduler
Et rien ne se passe. Bien que des DAG beaucoup plus complexes soient exécutés sur cette instance, j'utilise ce cas fictif pour créer un test simple qui sert également d'écouteur pour me faire savoir quand le planificateur fonctionne comme prévu.
J'utilise journalctl -f
pour déboguer. Voici quelques lignes de sortie du processus du planificateur. Il n'y a pas de problème évident, mais mes tâches ne s'exécutent pas et aucun journal n'est généré pour le test DAG qui m'aiderait à zoomer sur l'erreur. Le problème est ici quelque part?
Sep 28 18:39:30 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:30,965] {dag_processing.py:627} INFO - Started a process (PID: 21822) to generate tasks for /home/ubuntu/airflow/dags/scheduler_test_dag.py - logging into /home/ubuntu/airflow/logs/scheduler/2017-09-28/scheduler_test_dag.py.log
Sep 28 18:39:31 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:31,016] {jobs.py:1002} INFO - No tasks to send to the executor
Sep 28 18:39:31 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:31,020] {jobs.py:1440} INFO - Heartbeating the executor
Sep 28 18:39:32 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:32,022] {jobs.py:1404} INFO - Heartbeating the process manager
Sep 28 18:39:32 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:32,023] {jobs.py:1440} INFO - Heartbeating the executor
Sep 28 18:39:33 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:33,024] {jobs.py:1404} INFO - Heartbeating the process manager
Sep 28 18:39:33 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:33,025] {dag_processing.py:559} INFO - Processor for /home/ubuntu/airflow/dags/capone_dash_dag.py finished
Sep 28 18:39:33 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:33,026] {dag_processing.py:559} INFO - Processor for /home/ubuntu/airflow/dags/scheduler_test_dag.py finished
Quand je lance airflow scheduler
manuellement tout cela fonctionne bien. Étant donné que mon test DAG a une date de début le 9 septembre, il ne cesse de remplir chaque minute depuis lors, produisant un ticker de temps de fonctionnement. Lorsque j'utilise systemd
pour exécuter le planificateur en tant que démon, cependant, il est totalement silencieux sans source évidente d'erreur.
Des pensées?
La documentation peut être datée?
Je démarre normalement Airflow comme suit
airflow kerberos -D
airflow scheduler -D
airflow webserver -D
Voici airflow webeserver --help
sortie (à partir de la version 1.8):
-D, --daemon Démoniser au lieu de s'exécuter au premier plan
Notez qu'il n'y a pas de drapeau booléen possible. La documentation doit être corrigée.
Note rapide dans le cas airflow scheduler -D
échoue:
Ceci est inclus dans les commentaires, mais il semble que cela mérite d'être mentionné ici. Lorsque vous exécutez votre planificateur de flux d'air, il crée le fichier $AIRFLOW_HOME/airflow-scheduler.pid
. Si vous essayez de relancer le processus du démon du planificateur de flux d'air, cela produira presque certainement le fichier $AIRFLOW_HOME/airflow-scheduler.err
qui vous dira que lockfile.AlreadyLocked: /home/ubuntu/airflow/airflow-scheduler.pid is already locked
. Si votre démon de planificateur est en effet hors service et que vous devez redémarrer, exécutez les commandes suivantes:
Sudo rm $AIRFLOW_HOME airflow-scheduler.err airflow-scheduler.pid
airflow scheduler -D
Cela a remis mon ordonnanceur sur la bonne voie.
À propos du démarrage de la tâche via systemd:
J'ai eu un problème avec la variable PATH lors de l'exécution de cette façon est initialement vide. Autrement dit, lorsque vous écrivez dans le fichier/etc/sysconfig/airflow:
PATH=/home/ubuntu/bin:/home/ubuntu/.local/bin:$PATH
vous écrivez littéralement:
PATH=/home/ubuntu/bin:/home/ubuntu/.local/bin
Ainsi, la variable PATH
ne contient pas /bin
qui est un utilitaire bash
que LocalExecutor utilise pour exécuter des tâches.
Je ne comprends donc pas pourquoi dans ce fichier vous n'avez pas spécifié AIRFLOW_HOME
. C'est-à-dire le répertoire dans lequel Airflow recherche son fichier de configuration.