Amazon EMR で失敗した Spark ステップをトラブルシューティングする方法を教えてください。

最終更新日: 2019 年 11 月 18 日

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.    アプリケーションマスターログを特定したら、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

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

改善できることはありますか?


さらにサポートが必要な場合