Comment résoudre l’erreur « java.lang.OutOfMemoryError: Espace de stockage Java » dans une tâche AWS Glue Spark ?

Lecture de 5 minute(s)
0

Message d’échec de ma tâche AWS Glue « La commande a échoué avec le code de sortie 1 ». Amazon CloudWatch indique l’erreur « java.lang.OutOfMemoryError: Espace de stockage Java ».

Brève description

L’erreur « java.lang.OutOfMemoryError: L’espace de stockage Java » indique qu’un pilote ou un exécuteur manque de mémoire JVM. Pour déterminer si un pilote ou un exécuteur est à l’origine de l’erreur OOM, consultez Débogage des exceptions OOM et des anomalies de tâche.

**Remarque ** : La résolution suivante concerne uniquement les exceptions OOM de pilote.

Les exceptions OOM de pilote sont causées par les facteurs suivants :

  • La tâche AWS Glue Spark traite un grand nombre de petits fichiers depuis Amazon Simple Storage Service (Amazon S3)
  • Opérations intensives du pilote type collect(), Broadcast joins et Shared variable

Résolution

Résoudre les exceptions OOM de pilote causées par un grand nombre de petits fichiers

Pour résoudre les exceptions OOM de pilote causées par un grand nombre de petits fichiers avec DynamicFrames, appliquez une ou plusieurs des méthodes suivantes.

Activer useS3ListImplementation

Lorsqu’il répertorie les fichiers, AWS Glue crée un index de fichiers dans les listes de mémoire du pilote. Lorsque vous définissez useS3ListImplementation sur True, AWS Glue ne met pas la liste des fichiers en cache dans la mémoire d’un seul coup. Au lieu de cela, AWS Glue met en cache la liste par lots. Avec cette stratégie par lots, le pilote est moins susceptible de manquer d'espace de mémoire.

Consultez l’exemple suivant pour savoir comment activer useS3ListImplementation avec from_catalog :

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table", additional_options = {'useS3ListImplementation': True}, transformation_ctx = "datasource0")

Consultez l’exemple suivant pour l’activation de useS3ListImplementation avec from_catalog :

datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")

La fonctionnalité useS3ListImplementation est une implémentation de l’opération Amazon S3 ListKeys. Elle permet de diviser les grands ensembles de résultats en plusieurs réponses. Une bonne pratique consiste à utiliser useS3ListImplementation avec des signets de tâches.

Regroupement

Une application Spark traite chaque petit fichier à l'aide d'une tâche Spark différente. Cette méthode peut entraîner une erreur OOM, car le pilote enregistre et suit les informations relatives à l’emplacement et aux tâches. Lorsque vous activez la fonctionnalité de regroupement, les tâches traitent un lot de plusieurs fichiers au lieu de fichiers individuels. Le regroupement est activé automatiquement lorsque vous utilisez des cadres dynamiques et que le jeu de données Amazon S3 contient plus de 50 000 fichiers. Pour en savoir plus, consultez la rubrique Lecture de fichiers d’entrée dans des groupes de grande taille.

Filtrage à l’aide de prédicats push down

Réduisez le nombre de fichiers Amazon S3 et de partitions Amazon S3 lus par la tâche AWS Glue en utilisant des prédicats push down. Cela supprime les partitions inutiles de la table AWS Glue avant que les données sous-jacentes ne soient lues. Pour en savoir plus, consultez la rubrique Pré-filtrage à l’aide de prédicats push down.

Exceptions OOM de pilote causées par des opérations intensives

Résolvez les exceptions OOM de pilote causées par des opérations intensives du pilote à l’aide de l’une des méthodes suivantes.

Faites attention aux opérations intensives pour les pilotes

collect() est une opération Spark qui collecte les résultats auprès des opérateurs, puis les renvoie au pilote sous la forme d’un objet unique. Les résultats peuvent être très importants, ce qui surcharge le pilote. Par défaut, la configuration Spark spark.driver.maxResultSize est définie sur 1 Go et permet de protéger le pilote contre toute surcharge.

Vous devez donc limiter ces actions et utilisez plutôt des actions comme take(), takeSample() ou isEmpty() dans la mesure du possible.

Sachez également que les jointures de diffusion dans Spark peuvent provoquer des erreurs OOM si la relation (table) est plus grande que la mémoire disponible du pilote. Avant qu’une relation ne soit diffusée vers les exécuteurs, elle est matérialisée au niveau du nœud pilote. Si plusieurs tables sont diffusées ou si la relation est trop importante, le pilote risque de manquer de mémoire. Utilisez les configurations Spark spark.sql.autoBroadcastJoinThreshold et Spark Join Hints pour contrôler cela.

Détruisez régulièrement les variables partagées

Veillez à utiliser les variables partagées avec précaution. Détruisez les variables partagées lorsque vous n’en avez plus besoin, car elles peuvent provoquer des exceptions OOM de pilote Spark. Il existe deux types de variables partagées : les variables de diffusion et les accumulateurs.

  • Les variables de diffusion sont des données en lecture seule qui ne sont envoyées aux exécuteurs qu’une seule fois. Il s’agit d’une solution intéressante pour stocker des données de référence immuables, telles qu’un petit dictionnaire ou de petites tables partagées entre tous les exécuteurs.
  • Les accumulateurs fournissent une copie modifiable aux exécuteurs Spark et peuvent être utilisés pour implémenter des compteurs distribués (comme dans MapReduce) ou des sommes.

Dépannage supplémentaire

Informations connexes

Optimiser la gestion de la mémoire dans AWS Glue

Lecture de fichiers d’entrée dans des groupes plus grands

Bonnes pratiques pour gérer efficacement la mémoire des applications Apache Spark sur Amazon EMR

Surveillance des tâches à l’aide de l’interface utilisateur Web d’Apache Spark

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans