Durch die Nutzung von AWS re:Post stimmt du den AWS re:Post Nutzungsbedingungen

Wie behebe ich einen fehlgeschlagenen Spark-Job in Amazon EMR?

Lesedauer: 5 Minute
0

Ich möchte einen fehlgeschlagenen Apache Spark-Job in Amazon EMR beheben.

Kurzbeschreibung

Gehen Sie wie folgt vor, um fehlgeschlagene Spark-Jobs in Amazon EMR auf Amazon Elastic Compute Cloud (Amazon EC2) zu beheben:

  • Bei Spark-Jobs, die mit --deploy-mode-client eingereicht werden, überprüfen Sie die Schrittprotokolle, um die Ursache des Schrittfehlers zu ermitteln.
  • Bei Spark-Jobs, die mit --deploy-mode-cluster eingereicht werden, überprüfen Sie zunächst die Schrittprotokolle, um die Anwendungs-ID zu identifizieren. Überprüfen Sie dann die Masterprotokolle der Anwendung, um die Hauptursache des Schrittfehlers zu ermitteln.

Um fehlgeschlagene Spark-Jobs auf Amazon EMR auf Amazon Elastic Kubernetes Service (Amazon EKS) zu beheben, identifizieren Sie die Hauptursache für den Ausfall des Spark-Jobs. Überprüfen Sie dazu die Treiberprotokolle von Amazon Simple Storage Service (Amazon S3) oder Amazon CloudWatch.

Um fehlgeschlagene Spark-Jobs auf Amazon EMR Serverless zu beheben, identifizieren Sie die Grundursache des Spark-Job-Fehlers. Überprüfen Sie dazu die Details zur Auftragsausführung in der Amazon EMR Serverless-Anwendungskonsole und in den Treiberprotokollen.

Behebung

Fehlerbehebung bei Amazon EMR auf Amazon EC2 bei fehlgeschlagenen Spark-Aufträgen

Jobs im Client-Modus
Wenn ein Spark-Job im Client-Modus bereitgestellt wird, enthalten die Schrittprotokolle die Jobparameter und Schrittfehlermeldungen. Die Schrittprotokolle werden in Amazon S3 archiviert.

Laden Sie die Schrittprotokolle auf eine Amazon EC2-Instance herunter, um die Ursache eines Schrittfehlers zu ermitteln. Suchen Sie dann nach Warnungen und Fehlern. Führen Sie die folgenden Schritte aus:

Führen Sie den folgenden Befehl aus, um die Schrittprotokolldatei zu dekomprimieren:

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

Führen Sie den folgenden Befehl aus, um die YARN-Anwendungs-ID aus dem Clustermodus-Protokoll zu identifizieren:

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

Die folgende Beispieldatei weist auf ein Speicherproblem hin:

„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.“

Um den vorherigen Fehler zu beheben, führen Sie den Befehl spark-submit aus, um einen Job mit erhöhtem Arbeitsspeicher zu senden. Weitere Informationen finden Sie unter Einreichen von Anwendungen auf der Apache Spark-Website.
Beispiel:

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

Jobs im Clustermodus
Überprüfen Sie das Schrittprotokoll stderr, um die ID der Anwendung zu ermitteln, die dem fehlgeschlagenen Schritt zugeordnet ist. Die Schrittprotokolle werden in Amazon S3 archiviert. Identifizieren Sie dann die primären Anwendungsprotokolle. Spark-Jobs, die im Clustermodus ausgeführt werden, werden im primären Anwendungsprotokoll ausgeführt. Das primäre Anwendungsprotokoll ist der erste Container, der ausgeführt wird, wenn ein Spark-Job gestartet wird. Im folgenden Beispiel ist der container_1572839353552_0008_01_000001 der erste Container der primären Anwendungsprotokolle.

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

Nachdem Sie die primären Protokolle der Anwendung identifiziert haben, laden Sie die Protokolle auf eine Amazon EC2-Instance herunter. Suchen Sie dann nach Warnungen und Fehlern.

Führen Sie den folgenden Befehl aus, um die Schrittprotokolldatei zu dekomprimieren:

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

Um in den Container-Protokollen nach Warnungen und Fehlern zu suchen, öffnen Sie die Container-Protokolle, die in der Ausgabe des folgenden Befehls enthalten sind:

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

Wenn ein Container-Protokoll auf ein Speicherproblem hinweist, führen Sie den folgenden spark-submit-Befehl aus, um einen Job mit erhöhtem Arbeitsspeicher zu senden:

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

Fehlerbehebung bei Amazon EMR auf Amazon EKS-fehlgeschlagenen Spark-Aufträgen

**Hinweis:**Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, finden Sie weitere Informationen unter Troubleshoot AWS CLI errors. Stellen Sie außerdem sicher, dass Sie die neueste Version von AWS CLI verwenden.

Wenn ein Spark-Job auf Amazon EKS an Amazon EMR übermittelt wird, können Protokolle auf Amazon S3 oder CloudWatch gespeichert werden. Stellen Sie sicher, dass Sie die Treiberprotokolle auf fehlgeschlagene Spark-Jobs überprüfen. Verwenden Sie außerdem kubectl-Befehle, um weitere Details zu den Treiber - und Executor-Protokollen für den laufenden Spark-Job abzurufen.

Hinweis: Kubectl-Befehle funktionieren nur für aktive Pods. Wenn Pods gestoppt sind, können Sie keine kubectl-Befehle ausführen.

Wenn Sie einen Spark-Job mit dem Befehl start-job-run einreichen, verwenden Sie die folgenden kubectl-Befehle:

kubectl get pods -n example-spark-namespace

Hinweis: Ersetzen Sie example-spark-namespace durch den Spark-Namespace, der zum Starten des Jobs verwendet wird.

kubectl logs spark-example-pod-driver -n example-spark-namespace -c spark-kubernetes-driver

Hinweis: Ersetzen Sie example-spark-namespace durch den Spark-Namespace, der zum Starten des Jobs verwendet wird, und example-pod durch den Pod-Namen.

Wenn Sie einen Spark-Job mit dem Befehl spark-operator einreichen, verwenden Sie die folgenden kubectl-Befehle:

kubectl get pods -n example-spark-namespace

Hinweis: Ersetzen Sie example-spark-namespace durch den Spark-Namespace, der zum Starten des Jobs verwendet wird.

kubectl logs example-pod-driver -n example-spark-namespace

Hinweis: Ersetzen Sie example-pod durch den Pod-Namen und example-spark-namespace durch den Spark-Namespace, der zum Starten des Jobs verwendet wird.

Wenn Sie einen Spark-Job mit dem Befehl spark-submit einreichen, verwenden Sie die folgenden kubectl-Befehle. Weitere Informationen finden Sie unter Einreichen von Anwendungen auf der Apache Spark-Website.

kubectl get pods -n example-spark-namespace

Hinweis: Ersetzen Sie example-spark-namespace durch den Spark-Namespace, der zum Starten des Jobs verwendet wird.

kubectl logs example-pod-driver -n example-spark-namespace

Hinweis: example-spark-namespace mit dem Spark-Namespace, der zum Starten des Jobs verwendet wird, und example-pod mit dem Pod-Namen.

Fehlerbehebung bei fehlgeschlagenen Spark-Jobs bei Amazon EMR Serverless

Wenn Sie einen Spark-Job in Amazon EMR Serverless einreichen, ist die Protokollierung standardmäßig für alle Auftragsausführungen aktiviert. Sie können auch die Amazon S3-Protokollierung für Ihren Amazon S3-Bucket aktivieren. Um Ihren fehlgeschlagenen Spark-Job zu beheben, sehen Sie sich die Details der Auftragsausführung an und wählen Sie dann die Option Treiberprotokolldateien. Sie können auch die in CloudWatch gespeicherten Protokolle überprüfen, um die Ursache für den fehlgeschlagenen Spark-Job zu ermitteln.

Ähnliche Informationen

Einen Spark-Schritt hinzufügen

Jobs mit Amazon EMR auf EKS ausführen

Protokollierung und Überwachung

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Monaten