Amazon EMR で失敗した Spark ステップをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2021 年 4 月 27 日

Amazon EMR で失敗した Apache Spark ステップについて、トラブルシューティングを行いたいと考えています。

簡単な説明

失敗した Spark ステップをトラブルシューティングするには:

  • --deploy-mode client で送信された Spark ジョブの場合: ステップログを確認して、ステップの失敗の根本原因を特定します。
  • --deploy-mode clusterで送信された Spark ジョブの場合: ステップログを確認してアプリケーション ID を特定します。次に、アプリケーションマスターログを確認して、ステップの失敗の根本原因を特定します。

解決方法

クライアントモードのジョブ

Spark ジョブをクライアントモードでデプロイすると、ステップログにジョブパラメータとステップエラーメッセージが表示されます。これらのログは Amazon Simple Storage Service(Amazon S3) にアーカイブされます。例:

  • s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/controller.gz: This file contains the spark-submit command.ジョブのパラメータを確認するには、このログを確認します。
  • s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz: This file provides the driver logs.(Spark ジョブがクライアントモードで実行されている場合、Spark ドライバーはマスターノードで実行されます。)

ステップの失敗の根本原因を特定するには、以下のコマンドを実行して、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにステップログをダウンロードします。その後、警告とエラーを検索します。

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

例えば、次のファイルです。

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

上記は、メモリの問題を示します。

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.

ログの情報を使用してエラーを解決します。

例えば、メモリの問題を解決するには、実行メモリを増やすジョブを送信します。

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

クラスターモードジョブ

1.    stderr ステップログを調べて、失敗したステップに関連付けられているアプリケーションの ID を特定します。ステップログは Amazon S3 にアーカイブされます。例えば、次のログです。

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

上記は application_1572839353552_0008を識別します。

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

2.    アプリケーションマスターログを特定します。Spark ジョブがクラスターモードで実行されると、Spark ドライバーはアプリケーションマスター内で実行されます。アプリケーションマスターは、Spark ジョブの実行時に実行される最初のコンテナです。Spark アプリケーションログのリストの例を次に示します。

このリストでは、 container_1572839353552_0008_01_000001 が最初のコンテナであり、これはアプリケーションマスターであることを意味します。

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.    アプリケーションマスターログを特定したら、Amazon EC2 インスタンスにログをダウンロードします。その後、警告とエラーを検索します。例:

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

たとえば、次のログです。

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

上記は、メモリの問題を示します。

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.    ログで特定された問題を解決します。例えば、メモリの問題を修正するには、実行メモリを増やしたジョブを送信します。

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

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?