Comment résoudre l'erreur « java.lang.OutOfMemoryError: Java heap space » (java.lang.OutOfMemoryError : espace du tas Java) dans AWS Glue ?

Date de la dernière mise à jour : 19/06/2020

Ma tâche AWS Glue échoue et je reçois le message « Command failed with exit code 1 » (Échec de la commande au niveau du code de sortie 1) tandis qu'Amazon CloudWatch Logs affiche l'erreur « java.lang.OutOfMemoryError: Java heap space » (java.lang.OutOfMemoryError : espace du tas Java).

Brève description

L'erreur « java.lang.OutOfMemoryError: Java heap space » (java.lang.OutOfMemoryError : espace du tas Java) indique qu'un processus de pilote ou d'exécution manque d'espace de mémoire. Pour déterminer si un pilote ou un exécuteur provoque l'erreur OOM, consultez Débogage des exceptions OOM et des anomalies de tâche. La résolution suivante concerne uniquement les exceptions OOM du pilote.

Solution

En règle générale, les exceptions OOM de pilote se produisent lorsqu'une tâche Apache Spark lit un grand nombre de petits fichiers à partir d'Amazon Simple Storage Service (Amazon S3). Résolvez les exceptions OOM de pilote avec DynamicFrames en utilisant une ou plusieurs des méthodes suivantes.

Regroupement

Lorsque vous activez la fonctionnalité de regroupement, les tâches traitent plusieurs fichiers au lieu de fichiers individuels. Pour plus d'informations, consultez Corriger le traitement de plusieurs fichiers grâce au regroupement.

Activer useS3ListImplementation

AWS Glue crée un index de fichiers dans la mémoire de pilote lorsqu'il répertorie les fichiers. Lorsque vous définissez useS3ListImplementation sur « True » comme l'illustre l'exemple suivant, AWS Glue ne met pas en cache l'ensemble de la liste des fichiers en 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.

Voici un exemple d'activation de useS3ListImplementation avec from_catalog :

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

Voici un exemple d'activation de useS3ListImplementation avec from_options :

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 qui fractionne les ensembles de résultats volumineux en plusieurs réponses. Une bonne pratique consiste à utiliser useS3ListImplementation avec des signets de tâche.

Résolution des problèmes supplémentaires

Si le regroupement et useS3ListImplementation ne résolvent pas les exceptions OOM de pilote, essayez la solution suivante :

  • Utilisez CloudWatch Logs et les métriques CloudWatch pour analyser la mémoire de pilote. Configurez des alarmes CloudWatch pour vous avertir lorsque des seuils spécifiques sont dépassés dans votre tâche.
  • Évitez d'utiliser des actions telles que collect (collecter) et count (compter). Ces actions collectent les résultats sur le pilote, ce qui peut entraîner des exceptions OOM de pilote.
  • Analysez votre ensemble de données et sélectionnez le type de travail adapté à votre tâche. Envisagez de mettre à l'échelle jusqu'à G.1X ou G.2X.