Wie greife ich auf Spark-Treiberprotokolle in einem Amazon EMR-Cluster zu?

Lesedauer: 4 Minute
0

Ich möchte auf die Apache Spark-Treiberprotokolle in einem Amazon EMR-Cluster zugreifen und Fehler in einer Spark-Anwendung beheben.

Behebung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.

Auf Amazon EMR wird Spark als YARN-Anwendung ausgeführt und unterstützt die Client- und Cluster-Bereitstellungsmodi.

Jobs im Client-Modus

Der Client-Modus ist der Standardbereitstellungsmodus. Im Client-Modus läuft der Spark-Treiber auf dem Host, auf dem der Befehl spark-submit ausgeführt wird. Wenn du den Befehl spark-submit mit --deploy-mode client auf dem Primärknoten ausführst, erhältst du die Treiberprotokolle im Terminalfenster. Amazon EMR archiviert diese Protokolle standardmäßig nicht. Um die Protokolle zu erfassen, speichere die Ausgabe des Befehls spark-submit in einer Datei.

Beispielbefehl:

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

Wenn du einen Amazon EMR-Schritt verwendest, um eine Spark-Anwendung einzureichen, archiviert Amazon EMR die Treiberprotokolle in der Datei stderr.gz in Amazon Simple Storage Service (Amazon S3). Der Dateipfad sieht in etwa wie folgt aus:

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

Weitere Informationen findest du unter In Amazon S3 archivierte Protokolldateien anzeigen.

Um auf die Spark-Treiberprotokolle zuzugreifen, lade die Schrittprotokolle auf eine Amazon Elastic Compute Cloud (Amazon EC2)-Instance herunter und suche dann nach Warnungen und Fehlern.

Führe die folgenden Schritte aus:

  1. Führe den folgenden sync-Befehl aus, um die Schrittprotokolle herunterzuladen:

    aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/
  2. Führe den folgenden Befehl aus, um den Schrittprotokollordner zu öffnen:

    cd s-2M809TD67U2IA/
  3. Führe den folgenden Befehl aus, um die Protokolldatei zu entpacken:

    find . -type f -exec gunzip filename\;

    Hinweis: Ersetze filename durch den Namen deiner Datei.

  4. Führe den folgenden Befehl aus, um die YARN-Anwendungs-ID aus dem Cluster-Modus-Protokoll abzurufen:

    grep "Client: Application report for" * | tail -n 1
  5. Führe den folgenden Befehl aus, um Fehler und Warnungen im Client-Modus-Protokoll zu finden:

    egrep "WARN|ERROR" *

Du kannst auch Anwendungen wie JupyterHub, Apache Livy oder Apache Zeppelin als Client verwenden, um eine Spark-Anwendung an den Cluster zu senden. Die Anwendungen speichern die Treiberprotokolle in den Protokollen der Anwendung im Ordner /mnt/var/log/ auf dem Primärknoten.

Du findest die komprimierten Protokolle auch im Amazon S3-Pfad s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/.

Wenn du Zeppelin verwendest, findest du die Spark-Treiberprotokolle in /mnt/var/log/zeppelin/zeppelin-interpreter-spark-##########.log.

Für Jupyter findest du die Treiberprotokolle in den Livy-Protokollen /mnt/var/log/livy/livy-livy-server.out.

Jobs im Cluster-Modus

Wenn du die Spark-Anwendung im Cluster-Modus einreichst, wird der Treiberprozess im primären Container der Anwendung ausgeführt. Der primäre Anwendungs-Container ist der erste Container, der bei der Ausführung der Spark-Anwendung ausgeführt wird. Der Client protokolliert den YARN-Anwendungsbericht.

Gehe wie folgt vor, um die Treiberprotokolle abzurufen:

  1. Rufe die Anwendungs-ID aus den Client-Protokollen ab.
    Beispielausgabe mit der Anwendungs-ID application_1572839353552_0008.

    19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)
  2. Identifiziere die Protokolle des primären Containers der Anwendung.
    Beispielliste von Spark-Anwendungsprotokollen:

    `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`

    Hinweis: Der erste Container in der Liste ist immer der primäre Container. In der vorherigen Liste ist der primäre Container container_1572839353552_0008_01_000001.

  3. Führe den folgenden sync-Befehl aus, um die Protokolle des primären Containers der Anwendung auf eine Instance herunterzuladen:

    aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/
  4. Führe den folgenden Befehl aus, um den Protokollordner der Spark-Anwendung zu öffnen:

    cd application_1572839353552_0008/
  5. Führe den folgenden Befehl aus, um die Protokolldatei zu entpacken:

    find . -type f -exec gunzip {} \;
  6. Führe den folgenden Befehl aus, um alle Container-Protokolle nach Fehlern und Warnungen zu durchsuchen:

    egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"
  7. Führe den folgenden Befehl aus, um die Adresse des Knotens abzurufen, auf dem der primäre Anwendungs-Container ausgeführt wurde. In einem laufenden Cluster kannst du die YARN-CLI verwenden, um die Protokolle des YARN-Anwendungs-Containers abzurufen:

    yarn logs -applicationId application_1585844683621_0001 | grep  'Container: container_1585844683621_0001_01_000001'

    Erwartetes Ergebnis:

    20/04/02 19:15:09 INFO client.RMProxy: Connecting to ResourceManager at ip-###-##-##-##.us-west-2.compute.internal/###.##.##.##:8032
    Container: container_1585844683621_0001_01_000001 on ip-###-##-##-##.us-west-2.compute.internal_8041
  8. Führe für Spark-Anwendungen, die du im Cluster-Modus einreichst, den folgenden Befehl aus, um die Protokolle des primären Containers der Anwendung abzurufen:

    yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-###-##-##-##.us-west-2.compute.internal

    **Hinweis:**Ersetze applicationId durch die ID deiner Anwendung, containerId durch die ID deines Containers und nodeAddress ip durch deine Knotenadresse.

Ähnliche Informationen

Fehlerbehebung bei Amazon EMR-Clustern

Spark konfigurieren

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Monaten