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

Lesedauer: 3 Minute
0

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

Kurzbeschreibung

Um fehlgeschlagene Spark-Schritte zu beheben:

  • Für Spark-Jobs, die mit --deploy-mode-Client übermittelt wurden: Überprüfen Sie die Schrittprotokolle, um die Hauptursache des Schrittfehlers zu ermitteln.
  • Für Spark-Jobs, die mit --deploy-mode-Cluster übermittelt werden: Überprüfen Sie die Schrittprotokolle, um die Anwendungs-ID zu ermitteln. Überprüfen Sie dann die Masterprotokolle der Anwendung, um die Hauptursache des Schrittfehlers zu ermitteln.

Behebung

Jobs im Client-Modus

Wenn ein Spark-Job im Client-Modus bereitgestellt wird, enthalten die Schrittprotokolle die Jobparameter und Schrittfehlermeldungen. Diese Protokolle werden in Amazon Simple Storage Service (Amazon S3) archiviert. Zum Beispiel:

  • **s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/controller.gz:**Diese Datei enthält den Befehl spark-submit. In diesem Protokoll finden Sie die Parameter für den Job.
  • **s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz:**Diese Datei enthält die Treiberprotokolle. (Wenn der Spark-Job im Client-Modus ausgeführt wird, wird der Spark-Treiber auf dem Master-Knoten ausgeführt.)

Um die Ursache des Schrittfehlers zu finden, führen Sie die folgenden Befehle aus, um die Schrittprotokolle auf eine Amazon Elastic Compute Cloud (Amazon EC2)-Instance herunterzuladen. Suchen Sie dann nach Warnungen und Fehlern:

#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" *

Zum Beispiel diese Datei:

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

weist auf ein Speicherproblem hin:

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.

Verwenden Sie die Informationen in den Protokollen, um den Fehler zu beheben.

Um das Speicherproblem zu lösen, reichen Sie beispielsweise einen Job mit mehr Executor-Speicher ein:

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

1.Überprüfen Sie das stderr-Schrittprotokoll, um die ID der Anwendung zu ermitteln, die dem fehlgeschlagenen Schritt zugeordnet ist. Die Schrittprotokolle werden in Amazon S3 archiviert. Zum Beispiel dieses Protokoll:

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

identifiziert application_1572839353552_0008:

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

2.Identifizieren Sie die Masterprotokolle der Anwendung. Wenn der Spark-Job im Clustermodus ausgeführt wird, wird der Spark-Treiber im Anwendungsmaster ausgeführt. Der Anwendungsmaster ist der erste Container, der ausgeführt wird, wenn der Spark-Job ausgeführt wird. Im Folgenden finden Sie eine Beispielliste von Spark-Anwendungsprotokollen.

In dieser Liste ist der Container_1572839353552_0008_01_000001 der erste Container, was bedeutet, dass er der Anwendungsmaster ist.

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.Nachdem Sie die Masterprotokolle der Anwendung identifiziert haben, laden Sie die Protokolle auf eine Amazon EC2-Instance herunter. Suchen Sie dann nach Warnungen und Fehlern. Zum Beispiel:

#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"

Zum Beispiel dieses Protokoll:

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

weist auf ein Speicherproblem hin:

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.Beheben Sie das in den Protokollen festgestellte Problem. Um das Speicherproblem zu beheben, reichen Sie beispielsweise einen Job mit mehr Executor-Speicher ein:

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

Verwandte Informationen

Einen Spark-Schritt hinzufügen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren