Comment dépanner une étape Spark ayant échoué dans Amazon EMR ?

Dernière mise à jour : 27/04/2021

Je souhaite dépanner une étape Apache Spark ayant échoué dans Amazon EMR.

Brève description

Pour dépanner des étapes Spark ayant échoué :

  • Pour les tâches Spark soumises avec --deploy-mode client : vérifiez les journaux d'étape pour identifier la cause racine de l'échec de l'étape.
  • Pour les tâches Spark soumises avec --deploy-mode cluster : vérifiez les journaux d'étape pour identifier l'ID d'application. Vérifiez ensuite les journaux du maître d'application pour identifier la cause racine de l'échec de l'étape.

Solution

Tâches en mode client

Lorsqu'une tâche Spark est déployée en mode client, les journaux d'étape fournissent les paramètres de tâche et les messages d'erreur d'étape. Ces journaux sont archivés dans Amazon Simple Storage Service (Amazon S3). Par exemple :

  • s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/controller.gz: Ce fichier contient la commande spark-submit. Consultez ce journal pour voir les paramètres de la tâche.
  • s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz: Ce fichier fournit les journaux du pilote. (Lorsque la tâche Spark s'exécute en mode client, le pilote Spark s'exécute sur le nœud maître.)

Pour trouver la cause racine de l'échec de l'étape, exécutez les commandes suivantes pour télécharger les journaux d'étapes dans une instance Amazon EC2 (Amazon Elastic Compute Cloud). Recherchez ensuite des avertissements et des erreurs :

#Download the step logs:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/
#Open the step log folder:
cd s-2M809TD67U2IA/
#Uncompress the log file:
find . -type f -exec gunzip {} \;
#Get the yarn application id from the cluster mode log:
grep "Client: Application report for" * | tail -n 1
#Get the errors and warnings from the client mode log:
egrep "WARN|ERROR" *

Par exemple, ce fichier :

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz

indique un problème de mémoire :

19/11/04 05:24:45 ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalArgumentException: Executor memory 134217728 must be at least 471859200. Please increase executor memory using the --executor-memory option or spark.executor.memory in Spark configuration.

Utilisez les informations contenues dans les journaux pour résoudre l'erreur.

Par exemple, pour résoudre le problème de mémoire, soumettez une tâche avec plus de mémoire d'exécuteur :

spark-submit --deploy-mode client --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar

Tâches en mode cluster

1.    Consultez le journal d'étape stderr pour identifier l'ID de l'application associée à l'étape ayant échoué. Les journaux d'étape sont archivés dans Amazon S3. Par exemple, ce journal :

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz

identifie application_1572839353552_0008:

19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)

2.    Identifiez les journaux du maître d'application. Lorsque la tâche Spark s'exécute en mode cluster, le pilote Spark s'exécute à l'intérieur du maître d'application. Le maître d'application est le premier conteneur qui s'exécute lorsque la tâche Spark s'exécute. Voici un exemple de liste de journaux d'application Spark.

Dans cette liste, container_1572839353552_0008_01_000001 est le premier conteneur. C'est donc le maître d'application.

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stdout.gz

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stderr.gz

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stdout.gz

3.    Une fois que vous avez identifié les journaux du maître d'application, téléchargez-les dans une instance Amazon EC2. Recherchez ensuite des avertissements et des erreurs. Par exemple :

#Download the Spark application logs:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/
#Open the Spark application log folder:
cd application_1572839353552_0008/ 
#Uncompress the log file:
find . -type f -exec gunzip {} \;
#Search for warning and errors inside all the container logs. Then, open the container logs returned in the output of this command.
egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"

Par exemple, ce journal :

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz

indique un problème de mémoire :

19/11/04 05:24:45 ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalArgumentException: Executor memory 134217728 must be at least 471859200. Please increase executor memory using the --executor-memory option or spark.executor.memory in Spark configuration.

4.    Résolvez le problème identifié dans les journaux. Par exemple, pour résoudre le problème de mémoire, soumettez une tâche avec plus de mémoire d'exécuteur :

spark-submit --deploy-mode cluster --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar 1000

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?