Passer au contenu

Comment résoudre les problèmes liés aux tâches bloquées à l’état En file d’attente dans mon environnement Amazon MWAA ?

Lecture de 9 minute(s)
0

J'exécute des flux de travail dans Amazon Managed Workflows pour Apache Airflow (Amazon MWAA), mais mes tâches sont bloquées à l’état En file d'attente. Les tâches ne passent pas à l'état En cours d’exécution.

Brève description

Les tâches dans Amazon MWAA peuvent rester bloquées à l’état En file attente pour les raisons suivantes :

  • L'environnement a atteint le nombre maximal de tâches simultanées.
  • Les options de configuration Airflow ne sont pas correctement définies dans votre environnement MWAA.
  • La mémoire ou le processeur sont insuffisants pour les tâches de l’exécutant.

Une tâche est bloquée à l’état En file d’attente lorsque le flux de travail normal d'exécution d'une tâche est interrompu. L’exécutant Apache Airflow peut faire face à une surcharge et ne pas répondre dans les délais impartis. Dans ce cas, la tâche reste dans la file d'attente Amazon Simple Queue Service (Amazon SQS) jusqu'à ce que le délai de visibilité par défaut soit atteint dans les 12 heures. Si vous avez configuré les nouvelles tentatives, le planificateur Apache Airflow recommence la tâche.

Résolution

Avant de résoudre le problème, déterminez si les ressources de votre environnement atteignent leur charge maximale ou rencontrent des problèmes liés à l’exécutant. Utilisez Amazon CloudWatch pour vérifier les journaux d’exécutant de votre environnement et les métriques CPUUtilization et MemoryUtilization.

Vérifier si l'environnement a atteint le nombre maximal de tâches simultanées

Votre environnement atteint le nombre maximal de tâches simultanées lorsque le groupe Amazon MWAA est plein et que l'environnement ajoute d'autres tâches à la file d'attente. Pour résoudre ce problème, augmentez le nombre d’exécutants dans votre environnement ou modifiez la taille de la classe d'environnement.

Pour déterminer si vous devez augmenter le nombre d’exécutants dans votre environnement, procédez comme suit :

  1. Ouvrez la console CloudWatch.
  2. Dans le volet de navigation, sélectionnez Métriques, puis Toutes les métriques.
  3. Choisissez l'onglet Parcours, sélectionnez la région AWS dans laquelle se trouve votre environnement, puis recherchez le nom de votre environnement.
  4. Dans la section Espaces de noms AWS, choisissez MWAA < File d’attente.
  5. Sélectionnez QueuedTasks et RunningTasks.
  6. Dans le graphique, trouvez la période la plus active, puis ajoutez le nombre total des deux métriques.
    Remarque : La somme correspond au nombre total de tâches pour cette période.
  7. Déterminez le niveau de simultanéité par défaut de votre environnement.
    Remarque : Par exemple, l'environnement mw1.small comporte cinq tâches simultanées pour chaque exécutant.
  8. Divisez le nombre total de tâches par le niveau par défaut des tâches simultanées.
  9. Soustrayez ce nombre par le nombre maximal d’exécutants que vous avez défini pour votre environnement.
    Remarque : Si le résultat est positif, vous devez ajouter des exécutants pour accomplir le nombre actuel de tâches simultanées.

Pour augmenter le nombre d’exécutants dans votre environnement ou modifier la taille de la classe d'environnement, procédez comme suit :

  1. Ouvrez la console Amazon MWAA.
  2. Sélectionnez votre environnement, choisissez Modifier, puis cliquez sur Suivant.
  3. Dans la section Classe d’environnement, effectuez les actions suivantes :
    Augmentez le nombre maximal d’exécutants que vous avez déterminé à l'étape 9.
    Définissez également le nombre minimal d’exécutants sur une valeur requise par votre charge de travail pendant les périodes de moindre activité.
    Remarque : Vous ne pouvez ajouter qu’un maximum de 25 exécutants pour votre environnement. Si vous avez besoin de plus de 25 exécutants, sous Classe d’environnement, choisissez une plus grande taille.
  4. Si vous augmentez la taille de la classe d'environnement, définissez également un nombre maximal et minimal d’exécutants requis pour votre charge de travail.

Si vous optimisez le nombre d’exécutants et qu'il n'est toujours pas suffisant pour votre charge de travail, prenez les mesures suivantes :

  • Utilisez des opérateurs différés à la place des capteurs Apache Airflow. Pour plus d'informations, consultez la page Opérateurs et déclencheurs déferrables sur le site Web d'Apache Airflow.
  • Échelonnez les heures de début d'exécution et conservez de petits intervalles de temps entre le schedule_interval de vos graphes orientés acycliques (DAG). Planifiez les DAG par blocs.
  • Si vous utilisez un code personnalisé qui invoque et surveille une fonction externe spécifique, divisez la tâche en deux tâches. Créez une tâche pour l'invocation et l'autre en tant qu'opérateur déferrable pour surveiller la fonction.

Vérifier si les options de configuration Airflow sont incorrectement définies

Pour vérifier les options de configuration Airflow, procédez comme suit :

  1. Ouvrez la console MWAA.
  2. Choisissez Environnements, puis sélectionnez votre environnement MWAA.
  3. Dans la section Options de configuration Airflow, vérifiez core.parallelism et celery.worker_autoscale.

Si core.parallelism est défini, supprimez toute option core.parallelism définie manuellement afin qu'Amazon MWAA puisse définir la configuration de manière dynamique. Amazon MWAA calcule la configuration dynamique par défaut selon (maxWorkers * maxCeleryWorkers) / schedulers * 1.5. Si vous utilisez l’autoscaling et que vous définissez la valeur manuellement, des problèmes de sous-utilisation peuvent survenir pendant la charge maximale.

Comparez la valeur de votre option de configuration celery.worker_autoscale au niveau de simultanéité par défaut. Si vous n'avez pas modifié l'option de configuration celery.worker_autoscale, multipliez le niveau de simultanéité par défaut par le nombre maximal d’exécutants que vous avez défini pour votre environnement.

Si la valeur de celery.worker_autoscale est involontairement inférieure à la valeur par défaut, utilisez les métriques CloudWatch pour surveiller l'utilisation du processeur et de la mémoire de vos exécutants. Si les valeurs de ressources sont comprises entre 20 et 60 % pendant la charge maximale, augmentez la valeur de celery.worker_autoscale à un nombre plus élevé. Utilisez de petits incréments afin de ne pas surutiliser les conteneurs d’exécutants.

Si vous n'avez pas défini la valeur de celery.worker_autoscale ou si vous avez conservé la valeur par défaut, surveillez l'utilisation du processeur et de la mémoire de vos exécutants. Si les métriques de votre environnement sont trop élevés, réduisez la valeur de celery.worker_autoscale. Si l'environnement est compris entre 20 et 60 % pendant la charge maximale, vous pouvez augmenter la valeur maximale.

Vérifier si les exécutants échouent en raison d'une surutilisation

Lorsque chaque exécutant de celery travaillant sur un conteneur d’exécutant MWAA a une tâche et est en charge maximale, les exécutants peuvent être surutilisés et échouer.

Les exécutants de celery recherchant dans le conteneur de MWAA Worker des tâches qui ne sont pas utilisées actuellement. En fonction de la complexité des tâches en cours d'exécution et du code qui les définit, les exécutants peuvent être surutilisés et potentiellement tomber en panne. Cela se produit lorsque chaque exécutant de celery sur un conteneur d’exécutant MWAA a une tâche et est soumis à une charge maximale.

Pour déterminer si les exécutants sont surutilisés ou défaillants, procédez comme suit :

  1. Ouvrez la console CloudWatch.
  2. Dans le volet de navigation, sélectionnez Métriques, puis Toutes les métriques.
  3. Choisissez l'onglet Parcourir, sélectionnez la région AWS dans laquelle se trouve votre environnement, puis recherchez le nom de votre environnement.
  4. Dans la section Espaces de noms AWS, choisissez MWAA < File d’attente, puis sélectionnez ApproximateAgeOfOldestTask.
  5. Élargissez l'intervalle de temps pour inclure une période de 4 à 6 semaines.
    Remarque : Des pics de 40 000 secondes ou plus indiquent que les tâches sont bloquées dans la file d'attente Amazon SQS et que les exécutants échouent en raison d'une surutilisation. De plus, l’exécutant de celery ne peut pas enregistrer l'échec dans la mémoire tampon des événements car le système l'a interrompu de force.

Vous pouvez également utiliser CloudWatch Insights pour vous avertir lorsque des tâches sont bloquées dans la file d'attente Amazon SQS.

Pour créer la règle, procédez comme suit :

  1. Ouvrez la console CloudWatch.

  2. Dans le volet de navigation, sélectionnez Journaux, puis Log Insights.

  3. Spécifiez une période de 4 à 6 semaines.

  4. Dans le menu Critères de sélection, sélectionnez le groupe de journaux du planificateur pour votre environnement MWAA.

  5. Saisissez la requête suivante dans la section de requête :

    fields _@timestamp_, _@message_, _@logStream_, _@log_  
    | filter _@message_ like /Was the task terminated externally?/  
    | sort _@timestamp_ desc  
    | limit 10000

    Voici un exemple de journal envoyé par le planificateur lorsqu'il reçoit une tâche précédemment mise en file d'attente :

    [[34m**2024-01-17T11:30:18.936+0000**[0m] [34mscheduler_job_runner.py:[0m771 ERROR[0m - Executor reports task instance <TaskInstance: dag_name.task_name manual__202X-XX-XXTXX:XX:XX.758774+00:00 [queued]> finished (failed) although the task says it's queued. (Info: None) Was the task terminated externally?[0m

Réduire les charges de travail gourmandes en ressources de calcul ou en mémoire

Remarque : Examinez attentivement la liste suivante. Tous les facteurs ne sont pas applicables à tous les cas d'utilisation. Si une assistance supplémentaire est nécessaire, contactez AWS Support.

Pour réduire les charges de travail gourmandes en ressources de calcul ou en mémoire dans votre environnement, procédez comme suit :

  • Assurez-vous que votre code DAG ne contient pas de scripts d'extraction, transformation et chargement (ETL), d'instructions de déplacement de données, de pipelines AI ou ML, ni d'autres charges de travail gourmandes en calcul ou en mémoire.
  • Suivez les bonnes pratiques d'Apache Airflow lorsque vous écrivez du code DAG. Assurez-vous que le code de niveau supérieur est réduit au minimum et n'importez que ce qui est nécessaire. Pour plus d'informations, consultez la page Bonnes pratiques sur le site Web d'Apache Airflow.
  • Optimisez le code DAG. Profilez l'empreinte mémoire de tous les capteurs, crochets ou opérateurs personnalisés, étendus ou hérités, afin de détecter les problèmes potentiels.

Si vos ressources sont toujours surutilisées, prenez les mesures suivantes :

  • Réduisez celery.worker_autoscale par rapport à sa valeur par défaut. Diminuez la valeur de celery.worker_autoscale de quelques chiffres, puis surveillez l'environnement pendant 24 à 48 heures. Continuez à diminuer la valeur de celery.worker_autoscale jusqu'à atteindre un niveau optimal.
    Remarque : Lorsque vous réduisez la valeur de celery.worker_autoscale, le groupe de tâches global se réduit et un plus grand nombre d'éléments demeurent plus longtemps à l'état En file d'attente. Pour y remédier, vous devez également augmenter le nombre minimal d’exécutants.
  • Suivez également à nouveau les étapes de la section Vérifier si l'environnement a atteint le nombre maximal de tâches simultanées afin de réduire le nombre de tâches simultanées par exécutant.

Informations connexes

Réglage des performances pour Apache Airflow sur Amazon MWAA

Référence de configuration sur le site Web d'Apache Airflow