Comment accéder aux journaux de pilotes Spark dans un cluster Amazon EMR ?

Dernière mise à jour : 13 avril 2020

Je dois dépanner une application Apache Spark. Comment accéder aux journaux de pilotes Spark dans un cluster Amazon EMR ?

Brève description

Sur Amazon EMR, Spark s'exécute en tant qu'application YARN et prend en charge deux modes de déploiement :

  • Mode client : mode de déploiement par défaut. En mode client, le pilote Spark s'exécute sur l'hôte sur lequel la commande spark-submit est exécutée.
  • Mode cluster: le pilote Spark s'exécute dans l'application master. L'application master est le premier conteneur qui s'exécute lorsque la tâche Spark s'exécute.

Solution

Tâches en mode client

Lorsque vous soumettez une application Spark en exécutant spark-submit avec le client --deploy-mode sur le nœud maître, les journaux de pilotes sont affichés dans la fenêtre du terminal. Amazon EMR n'archive pas ces journaux par défaut. Pour capturer les journaux, enregistrez la sortie de la commande spark-submit sur un fichier. Exemple :

$ spark-submit [--deploy-mode client] ... 1>output.log 2>error.log

Lorsque vous soumettez une application Spark à l'aide d'une étape Amazon EMR, les journaux de pilotes sont archivés sur le fichier stderr.gz sur Amazon Simple Storage Service (Amazon S3). Le chemin du fichier ressemble à ce qui suit :

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

Pour plus d'informations, consultez Affichage des fichiers journaux.

Téléchargez les journaux d'étape sur une instance Amazon Elastic Compute Cloud (Amazon EC2), puis recherchez les avertissements et les erreurs :

1.    Téléchargez les journaux d'étape :

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

2.    Ouvrez le dossier du journal d'étape :

cd s-2M809TD67U2IA/

3.    Décompressez le fichier de journal :

find . -type f -exec gunzip {} \;

4.    Obtenez l'id de l'application YARN du journal en mode cluster :

grep "Client: Application report for" * | tail -n 1

5.    Trouvez des erreurs et des avertissements dans le journal en mode client :

egrep "WARN|ERROR" *

Il est également possible de soumettre une application Spark à l'aide d'une application telle que JupyterHub, Apache Livy ou Apache Zeppelin. Ces applications deviennent le client qui soumet l'application Spark au cluster. Dans ce scénario, les journaux de pilotes sont stockés dans les journaux de l'application correspondante, dans le dossier /mnt/var/log/ sur le nœud maître. Vous pouvez également trouver les journaux compressés au chemin Amazon S3 suivant :

s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/

Par exemple, si vous utilisez Zeppelin, vous pouvez trouver les journaux de pilotes Spark dans /mnt/var/log/zeppelin/zeppelin-interpreter-spark-xxxxxxxxxx.log.

Remarque : pour Jupyter, les journaux de pilotes sont stockés dans les journaux Livy : /mnt/var/log/livy/livy-livy-server.out.

Pour plus d'informations sur l'accès aux journaux spécifiques à l'application, consultez Afficher les fichiers journaux.

Tâches en mode cluster

Lorsque vous soumettez l'application Spark en mode cluster, le processus pilote s'exécute dans le conteneur application master. L'application master est le premier conteneur qui s'exécute lorsque l'application Spark s'exécute. Le client journalise le rapport d'application YARN. Pour obtenir les journaux de pilotes :

1.    Obtenez l'ID d'application des journaux client. Dans l'exemple suivant, application_1572839353552_0008 est l'ID d'application.

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

2.    Identifiez les journaux de conteneur application master. Ce qui suit est un exemple de liste des journaux d'application Spark. Dans cette liste, container_1572839353552_0008_01_000001 est le premier conteneur, ce qui signifie qu'il est le conteneur application master.

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.    Téléchargez les journaux de conteneurs application master vers l'instance EC2 :

aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/

4.    Ouvrez le dossier du journal de l'application Spark :

cd application_1572839353552_0008/

5.    Décompressez le fichier de journal :

find . -type f -exec gunzip {} \;

6.    Vérifiez tous les journaux de conteneur à la recherche d'erreurs et d'avertissements :

egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"

7.    Ouvrez les journaux de conteneur renvoyés dans la sortie de la commande précédente.

Sur un cluster en cours d'exécution, vous pouvez utiliser l'interface de ligne de commande YARN pour obtenir les journaux de conteneur d'application. Pour une application Spark soumise en mode cluster, vous pouvez accéder aux journaux de pilotes Spark en récupérant les journaux de conteneur application master comme ceci :

# 1. Get the address of the node that the application master container ran on
$ yarn logs -applicationId application_1585844683621_0001 | grep  'Container: container_1585844683621_0001_01_000001'

20/04/02 19:15:09 INFO client.RMProxy: Connecting to ResourceManager at ip-xxx-xx-xx-xx.us-west-2.compute.internal/xxx.xx.xx.xx:8032
Container: container_1585844683621_0001_01_000001 on ip-xxx-xx-xx-xx.us-west-2.compute.internal_8041

# 2. Use the node address to pull the container logs
$ yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-xxx-xx-xx-xx.us-west-2.compute.internal

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

Que pouvons-nous améliorer ?


Besoin de plus d'aide ?