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 Apache 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 ce qui est attribué à l'exécuteur 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, adoptez une ou plusieurs des solutions suivantes.
Mettez à niveau le type d’environnement de travail
Étant donné que G.2x présente des configurations de mémoire plus élevées, mettez à niveau le type d’environnement de travail. Vous pouvez mettre à niveau le type d’environnement de travail de G.1x vers les types d’environnements 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 d’environnements de travail, 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écuteurs pour la tâche
Si l'erreur persiste après la mise à niveau du type d’environnement de travail, augmentez le nombre d'exécuteurs pour la tâche. Pour chaque exécuteur, il existe un certain nombre de cœurs. Ce nombre détermine le nombre de partitions pouvant être traitées par l'exécuteur. Le type d’environnement de travai 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écuteurs 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écuteurs, 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, les tâches AWS Glue ne traitent que 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 traités lors de l'exécution précédente. Lors 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 exécuteur Spark unique. Ce téléchargement peut prendre plus de temps et provoquer des erreurs de mémoire insuffisante (OOM) pour l'exécuteur. À la place, configurez 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 le Spark df.count() 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 morceaux 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 des tâches Spark et partitionner les données avec AWS Glue
Optimiser la gestion de la mémoire dans AWS Glue