web-dev-qa-db-fra.com

Le planificateur de flux d'air est lent à planifier les tâches suivantes

Lorsque j'essaie d'exécuter un DAG dans Airflow 1.8.0, je trouve que cela prend beaucoup de temps entre le moment de la fin de la tâche précédente et le moment où la tâche suivante est récupérée pour exécution (généralement les temps d'exécution des tâches individuelles sont généralement plus longs). ). Il en va de même pour les exécuteurs séquentiels, locaux et céleris. Existe-t-il un moyen de réduire le temps de fonctionnement mentionné? (comme tous les paramètres dans airflow.cfg qui peuvent accélérer l'exécution du DAG?) Un diagramme de Gantt a été ajouté pour référence: Gantt chart

15
Prasann

Comme l'a dit Nick, Airflow n'est pas un outil en temps réel. Les tâches sont planifiées et exécutées dès que possible, mais la tâche suivante ne s'exécutera jamais immédiatement après la dernière.

Lorsque vous avez plus de ~ 100 DAG avec ~ 3 tâches dans chacun ou Dags avec plusieurs tâches (~ 100 ou plus), vous devez considérer 3 choses:

  1. Augmentez le nombre de threads que le DagFileProcessorManager utilisera pour charger et exécuter les Dags (airflow.cfg):

[planificateur]

max_threads = 2

Le max_threads contrôle le nombre de DAG sélectionnés et exécutés/terminés ( voir ici ).

L'augmentation de cette configuration peut réduire le temps entre les tâches.

  1. Surveillez votre base de données Airflow pour voir si elle présente des goulots d'étranglement. La base de données Airflow est utilisée pour gérer et exécuter les processus:

Récemment, nous souffrions du même problème. Le temps entre les tâches était de ~ 10-15 minutes, nous utilisions PostgreSQL sur AWS.

L'instance n'utilisait pas très bien les ressources; ~ 20 IOPS, 20% de la mémoire et ~ 10% du CPU, mais Airflow était très lent.

Après avoir examiné les performances de la base de données à l'aide de PgHero, nous avons découvert que même une requête utilisant un index sur une petite table passait plus d'une seconde.

Nous avons donc augmenté la taille de la base de données et Airflow fonctionne désormais aussi vite qu'une fusée. :)

  1. Pour obtenir le temps qu'Airflow consacre au chargement des Dags, exécutez la commande:

airflow list_dags -r

Temps d'analyse du DagBag: 7,9497220000000075

Si le temps d'analyse du DagBag est supérieur à ~ 5 minutes, cela peut être un problème.

Tout cela nous a aidés à exécuter Airflow plus rapidement. Je vous conseille vraiment de passer à la version 1.9 car de nombreux problèmes de performances ont été corrigés sur cette version

BTW, nous utilisons le maître Airflow en production, avec LocalExecutor et PostgreSQL comme base de données de métadonnées.

19
Marcos Bernardelli

Votre diagramme de Gantt montre les choses dans l'ordre des secondes. Airflow n'est pas censé être un moteur de planification en temps réel. Il traite de choses de l'ordre des minutes. Si vous avez besoin que les choses fonctionnent plus rapidement, vous pouvez envisager un outil de planification différent de celui de l'airflow. Alternativement, vous pouvez mettre tout le travail dans une seule tâche afin de ne pas souffrir des retards du planificateur.

2
Nick

J'ai dû patcher le code de remplissage de dag car chaque travailleur a passé plus de 30 secondes à remplir le sac de dag. Le problème vient du code models.py detect_downstream_cycle qui prend beaucoup de temps à s'exécuter. Dans mes tests utilisant la commande list_dags voici mes résultats:

0
Don Iuppa