Amazon EMR で Spark ステップが失敗した場合にトラブルシューティングする方法を教えてください。
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
関連情報

関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 7ヶ月前lg...
- AWS公式更新しました 8ヶ月前
- AWS公式更新しました 2年前
- AWS公式更新しました 9ヶ月前
- AWS公式更新しました 9ヶ月前