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

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

Cette page fournit des étapes de dépannage et des informations pour 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 sont dus à des ressources de déclencheur insuffisantes ou à des problèmes liés au code d'opérateur asynchrone personnalisé.

Les journaux du déclencheur affichent tous les messages d'avertissement pouvant vous aider à identifier l'origine d'une baisse des performances du déclencheur. Il y a deux avertissements significatifs à rechercher.

  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, allouez plus de ressources aux déclencheurs, réduisez le nombre de tâches différées exécutées en même temps ou augmentez le nombre de déclencheurs dans votre environnement. N'oubliez pas que même si les déclencheurs gèrent les tâches différables, ce sont les nœuds de calcul qui sont chargés de démarrer et de terminer chaque tâche. Si vous ajustez le nombre de déclencheurs, envisagez également d'ajuster le nombre d'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/my-custom-code.py:609> result=None> took 0.401 second
    

    Cet avertissement renvoie vers un extrait de code d'opérateur spécifique exécuté par Cloud Composer. Par leur conception, les déclencheurs doivent s'appuyer sur la bibliothèque asyncio pour exécuter les 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 mise en œuvre.

Trop de déclencheurs

Le nombre de tâches différées est visible dans la métrique task_count qui s'affiche également sur le tableau de bord Monitoring de votre environnement. Chaque déclencheur crée certaines 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 sur 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 les redémarrages, car la vérification d'activité échoue en raison de l'absence de pulsations:

Le déclencheur redémarre en raison de ressources insuffisantes
Figure 2 : Le déclencheur redémarre en raison de ressources insuffisantes (cliquez pour agrandir)

Solution: Pour résoudre ce problème, allouez plus de ressources aux déclencheurs, réduisez le nombre de tâches différées exécutées en même temps ou augmentez le nombre de déclencheurs dans votre environnement.

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

Une fois l'exécution du déclencheur terminée, la commande est renvoyée à 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 l'exécuteur Celery. Par conséquent, les limites de configuration et de ressources correspondantes s'appliquent (par exemple, parallelism ou worker_concurrency).

Si la méthode de rappel échoue dans le nœud de calcul Airflow, que celui-ci échoue ou que 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, 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 que seul le déclencheur défaillant soit exécuté à la fois. Dans ce cas, un avertissement est généré dans les journaux du déclencheur une fois que le déclencheur problématique est terminé.

Classe de déclencheur introuvable

Étant donné que le dossier des DAG n'est pas synchronisé avec le déclencheur Airflow, le code du 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'interface utilisateur d'Airflow

Dans certains cas, après la désactivation du déclencheur, le message d'avertissement suivant peut s'afficher dans l'interface utilisateur d'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 il reste des déclencheurs incomplets dans la base de données Airflow. Ce message signifie généralement que le déclencheur a été désactivé avant l'achèvement de tous les déclencheurs dans votre environnement.

Pour afficher tous les déclencheurs en cours d'exécution dans l'environnement, accédez à la page Parcourir > Déclencheurs de l'interface utilisateur Airflow (le rôle Admin est requis).

Solutions :

Les tâches restent à l'état "Différé" après la désactivation du déclencheur

Lorsque le déclencheur est désactivé, les tâches qui sont déjà à l'état différé restent dans cet état jusqu'à l'expiration du délai. Ce délai peut être infini, en fonction de la configuration Airflow et du DAG.

Utilisez l'une des solutions suivantes :

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

Nous vous recommandons de ne désactiver le déclencheur que si votre environnement n'exécute pas d'opérateurs ou de tâches différés et que toutes les tâches différées sont terminées.

Étapes suivantes