Comment résoudre l’erreur « java.lang.OutOfMemoryError: Espace de stockage Java » dans une tâche AWS Glue Spark ?
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
- Analysez votre jeu de données et sélectionnez le type d'opérateur adapté à votre tâche. Envisagez de passer à G.1X ou G.2X.
- Utilisez CloudWatch Logs et CloudWatch Metrics pour analyser la mémoire du pilote. Configurez des alarmes CloudWatch pour vous avertir lorsque des seuils spécifiques sont dépassés dans votre tâche.
- Activez l'interface utilisateur Spark pour votre tâche AWS Glue et consultez les journaux des événements Spark pour comprendre pourquoi l'OOM se produit. Pour en savoir plus, consultez la rubrique Surveillance des tâches à l’aide de l’interface utilisateur Web d’Apache Spark.
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
Contenus pertinents
- demandé il y a 2 anslg...
- demandé il y a 8 moislg...
- demandé il y a 7 moislg...
- demandé il y a 4 moislg...
- AWS OFFICIELA mis à jour il y a 2 ans
- AWS OFFICIELA mis à jour il y a 3 ans
- AWS OFFICIELA mis à jour il y a 3 ans
- AWS OFFICIELA mis à jour il y a 3 ans