Résoudre les problèmes avec le déclencheur Airflow

Airflow géré (3e génération) | Airflow géré (2e génération) | Airflow géré (1re génération héritée)

Cette page fournit des étapes de dépannage et des informations sur les problèmes courants liés au déclencheur Airflow.

Opérations de blocage dans le déclencheur

Les tâches asynchrones peuvent parfois être bloquées dans les déclencheurs. Dans la plupart des cas, les problèmes proviennent d'un manque de ressources du déclencheur ou de problèmes liés au code de l'opérateur asynchrone personnalisé.

Les journaux du déclencheur affichent tous les messages d'avertissement qui peuvent vous aider à identifier les causes profondes de la baisse des performances du déclencheur. Deux avertissements importants sont à surveiller.

  1. Thread asynchrone bloqué :

    Triggerer's async thread was blocked for 1.2 seconds, likely due to the
    highly utilized environment.
    

    Cet avertissement signale des problèmes de performances dus à un volume élevé de tâches asynchrones.

    Solution : Pour résoudre ce problème :

    • Ajustez les paramètres du déclencheur pour allouer davantage de ressources aux déclencheurs ou augmenter le nombre de déclencheurs dans votre environnement.
    • Réduisez le nombre de tâches différées exécutées simultanément.

    Même si les déclencheurs gèrent les tâches différables, les nœuds de calcul Airflow sont responsables du démarrage et de la finalisation de chaque tâche. Si vous ajustez le nombre de déclencheurs, pensez également à mettre à l'échelle le nombre de vos instances de nœuds de calcul.

  2. Une tâche spécifique a bloqué le thread asynchrone :

    WARNING - Executing <Task finished coro=<TriggerRunner.run_trigger() done,
    defined at /opt/***/***/jobs/example.py:609> result=None> took 0.401
    second
    

    Cet avertissement pointe vers un élément spécifique du code de l'opérateur exécuté par Managed Service for Apache Airflow. Les déclencheurs reposent par conception sur la bibliothèque asyncio pour exécuter des opérations en arrière-plan. Une implémentation personnalisée d'un déclencheur peut ne pas respecter correctement les contrats asyncio (par exemple, en raison d' une utilisation incorrecte des mots clés await et async dans le code Python).

    Solution : Inspectez le code signalé par l'avertissement et vérifiez si l'opération asynchrone est correctement implémentée.

Trop de déclencheurs

Le nombre de tâches différées est visible dans la métrique task_count, qui s'affiche également dans le tableau de bord Monitoring de votre environnement. Chaque déclencheur crée des ressources telles que des connexions à des ressources externes, qui consomment de la mémoire.

Tâches différées affichées dans le tableau de bord Monitoring
Figure 1. Tâches différées affichées dans le tableau de bord Monitoring (cliquez pour agrandir)

Les graphiques de consommation de mémoire et de processeur indiquent que des ressources insuffisantes entraînent des redémarrages, car la sonde de disponibilité échoue en raison de l'absence de pulsations :

Redémarrages du déclencheur en raison d&#39;un manque de ressources
Figure 1. Redémarrages du déclencheur en raison de ressources insuffisantes (cliquez pour agrandir)

Solution : Pour résoudre ce problème :

  • Ajustez les paramètres du déclencheur pour allouer davantage de ressources aux déclencheurs ou augmenter le nombre de déclencheurs dans votre environnement.
  • Réduisez le nombre de tâches différées exécutées simultanément.

Plantages d'un nœud de calcul Airflow lors de l'exécution du rappel

Une fois l'exécution du déclencheur terminée, le contrôle revient à un nœud de calcul Airflow, qui exécute une méthode de rappel à l'aide d'un emplacement d'exécution. Cette phase est contrôlée par Celery Executor. Par conséquent, la configuration et les limites de ressources correspondantes s'appliquent (telles que parallelism ou worker_concurrency).

Si la méthode de rappel échoue dans le nœud de calcul Airflow, si le nœud de calcul échoue ou si le nœud de calcul qui exécute la méthode redémarre, la tâche est marquée comme FAILED. Dans ce cas, l'opération de nouvelle tentative réexécute l'intégralité de la tâche, et pas seulement la méthode de rappel.

Boucle infinie dans un déclencheur

Il est possible d'implémenter un opérateur de déclencheur personnalisé de manière à bloquer entièrement la boucle principale du déclencheur, de sorte qu'un seul déclencheur défectueux soit exécuté à la fois. Dans ce cas, un avertissement est généré dans les journaux du déclencheur une fois le déclencheur problématique terminé.

Classe de déclencheur introuvable

Étant donné que le dossier DAG n'est pas synchronisé avec le déclencheur Airflow, le code de déclencheur intégré est manquant lors de l'exécution du déclencheur. L'erreur est générée dans les journaux de la tâche ayant échoué :

ImportError: Module "PACKAGE_NAME" does not define a "CLASS_NAME" attribute/
class

Solution : Importez le code manquant à partir de PyPI.

Message d'avertissement concernant le déclencheur dans l'UI Airflow

Dans certains cas, une fois le déclencheur désactivé, le message d'avertissement suivant peut s'afficher dans l'UI Airflow.

The triggerer does not appear to be running. Last heartbeat was received
4 hours ago. Triggers will not run, and any deferred operator will remain
deferred until it times out or fails.

Airflow peut afficher ce message, car des déclencheurs incomplets restent dans la base de données Airflow. Ce message signifie généralement que le déclencheur a été désactivé avant que tous les déclencheurs n'aient été exécutés dans votre environnement.

Vous pouvez afficher tous les déclencheurs en cours d'exécution dans l'environnement en consultant la page Browse > Triggers de l'UI Airflow. Le rôle Admin est requis.

Solutions:

Les tâches restent à l'état "différé" une fois le déclencheur désactivé

Lorsque le déclencheur est désactivé, les tâches qui sont déjà à l'état "différé" restent dans cet état jusqu'à ce que le délai d'inactivité soit atteint. Ce délai d'inactivité peut être infini, selon la configuration d'Airflow et du DAG.

Utilisez l'une des solutions suivantes :

  • Marquez manuellement les tâches comme ayant échoué.
  • Activez le déclencheur pour terminer les tâches.

Nous vous recommandons de désactiver le déclencheur uniquement si votre environnement n'exécute aucun opérateur ni aucune tâche différée, et que toutes les tâches différées sont terminées.

Étape suivante