Comment puis-je résoudre l'échec d'une étape Spark dans Amazon EMR ?

Date de la dernière mise à jour : 18/11/2019

Comment puis-je résoudre l'échec d'une étape Apache Spark dans Amazon EMR ?

Brève description

Pour dépanner les é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.

Ré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'étape sur une instance Amazon Elastic Compute Cloud (Amazon EC2), puis recherchez les avertissements et les 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 du programme d'exécution :

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 des étapes 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 sur une instance EC2. Recherchez ensuite les avertissements et les 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 du programme d'exécution :

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 ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?