Passer au contenu

Pourquoi ma tâche AWS Glue ETL échoue-t-elle avec l’erreur « Container killed by YARN for exceeding memory limits » ?

Lecture de 4 minute(s)
0

Ma tâche d'extraction, transformation et chargement (ETL) AWS Glue échoue avec l'erreur « Container killed by YARN for exceeding memory limits ».

Brève description

Les causes courantes de cette erreur sont les suivantes :

  • Opérations gourmandes en mémoire qui dépassent le seuil de mémoire du cluster Spark sous-jacent. Ces opérations peuvent notamment se produire lorsque vous joignez des tables volumineuses ou que vous traitez des jeux de données dont la distribution est asymétrique.
  • Partitions volumineuses de données consommant plus de mémoire que celle attribuée à l’exécutant concerné.
  • Fichiers volumineux que vous ne pouvez pas fractionner, ce qui entraîne la création de partitions en mémoire volumineuses.

Résolution

Pour résoudre cette erreur, implémentez une ou plusieurs des solutions suivantes :

Effectuez une mise à niveau du type de worker

Étant donné que G.2x utilise des configurations de mémoire supérieure, mettez à niveau le type de worker. Vous pouvez mettre à niveau le type de worker de G.1x vers les types de workers suivants :

  • G.2x
  • G.4x
  • G.8x
  • G.12x
  • G.16x
  • R.1x
  • R.2x
  • R.4x
  • R.8x

Pour plus d'informations sur les spécifications des types de workers, consultez les sections Définition des propriétés de tâche pour les tâches Spark et Versions d’AWS Glue.

Augmenter le nombre d'exécutants pour la tâche

Si l'erreur persiste après la mise à niveau du type de worker, augmentez le nombre d'exécutants pour la tâche. Pour chaque exécutant, il existe un certain nombre de cœurs. Ce nombre détermine le nombre de partitions que l'exécutant peut traiter. Le type de worker définit les configurations Spark pour les unités de traitement de données (DPU).

Mettre à jour vos données

Pour vous assurer qu'AWS Glue utilise les exécutants de manière uniforme avant une opération de shuffle, telle que des jointures, vérifiez que vos données sont parallèles. Pour répartir les données entre tous les exécutants, incluez l'une des commandes suivantes dans votre tâche ETL.

Pour DynamicFrame, incluez la commande suivante :

dynamicFrame.repartition(totalNumberOfExecutorCores)

Pour DataFrame, incluez la commande suivante :

dataframe.repartition(totalNumberOfExecutorCores)

Utiliser des signets de tâche

Lorsque vous utilisez des signets de tâche, le signet indique qu'AWS Glue traite uniquement les fichiers nouvellement écrits. Cette configuration réduit le nombre de fichiers traités par la tâche AWS Glue et réduit les problèmes de mémoire. Les signets stockent les métadonnées des fichiers de l'exécution précédente. Au cours des exécutions qui suivent, la tâche compare l'horodatage, puis décide de traiter à nouveau ces fichiers. Pour plus d'informations, consultez la section Suivi des données traitées à l'aide de signets de tâche.

Utiliser DynamicFrame pour lire les données en parallèle

Lorsque vous vous connectez à une table JDBC, Spark n'ouvre qu'une seule connexion simultanée par défaut. Le pilote essaie de télécharger la table complète en une seule fois dans un seul exécutant Spark. Ce téléchargement peut prendre plus de temps et provoquer des erreurs de mémoire insuffisante (OOM) pour l'exécutant. Configurez plutôt les propriétés spécifiques de votre table JDBC pour demander à AWS Glue d'utiliser DynamicFrame pour lire les données en parallèle. Vous pouvez également utiliser Spark DataFrame pour effectuer des lectures parallèles depuis JDBC. Pour plus d'informations, consultez la page JDBC vers d'autres bases de données sur le site Web de Spark.

Utiliser des fonctions performantes dans votre tâche ETL

Pour votre tâche ETL, n'utilisez pas de fonctions définies par l'utilisateur, en particulier lorsque vous combinez du code Python ou Scala avec les fonctions et méthodes de Spark. Par exemple, n'utilisez pas la fonction df.count() Spark pour vérifier les DataFrames vides dans les instructions if/else ou les boucles for. Utilisez plutôt des fonctions plus performantes, telles que df.schema() ou df.rdd.isEmpty().

Tester et optimiser la tâche AWS Glue

Avant d'exécuter la tâche AWS Glue en production, testez-la lors d'une session interactive et optimisez le code ETL.

Si aucune des options de solution précédentes ne fonctionne, divisez les données d'entrée en segments ou en partitions. Puis, exécutez plusieurs tâches ETL AWS Glue au lieu d'exécuter une seule tâche importante. Pour plus d'informations, consultez la section Partitionnement de la charge de travail avec exécution limitée.

Informations connexes

Débogage des exceptions OOM et des anomalies de tâche

Bonnes pratiques pour mettre à l’échelle les tâches Apache Spark et partitionner les données avec AWS Glue

Optimiser la gestion de la mémoire dans AWS Glue

AWS OFFICIELA mis à jour il y a 3 mois