Amazon EMR で失敗した Spark ジョブをトラブルシューティングする方法を教えてください。
Amazon EMR で失敗した Apache Spark ジョブのトラブルシューティングを行いたいと考えています。
簡単な説明
Amazon Elastic Compute Cloud (Amazon EC2) 上の Amazon EMR で失敗した Spark ジョブをトラブルシューティングするには、次の手順を実行します。
- --deploy-mode-client を使用して送信された Spark ジョブについては、ステップログを確認してステップ障害の根本原因を特定してください。
- --deploy-mode-cluster を使用して送信された Spark ジョブについては、まずステップログを確認してアプリケーション ID を特定します。次に、アプリケーションマスターログをチェックして、ステップ障害の根本原因を特定します。
Amazon Elastic Kubernetes Service (Amazon EKS) 上の Amazon EMR で失敗した Spark ジョブをトラブルシューティングするには、Spark ジョブの失敗の根本原因を特定してください。これを行うには、Amazon Simple Storage Service (Amazon S3) または Amazon CloudWatch のドライバーログを確認してください。
Amazon EMR Serverless で失敗した Spark ジョブのトラブルシューティングを行うには、Spark ジョブの失敗の根本原因を特定します。これを行うには、Amazon EMR Serverless アプリケーションコンソールとドライバーログからジョブ実行の詳細を確認します。
解決策
Amazon EC2 での Amazon EMR で失敗した Spark ジョブのトラブルシューティング
**クライアントモードのジョブ **
Spark ジョブをクライアントモードでデプロイすると、ステップログにジョブパラメーターとステップエラーメッセージが表示されます。これらのログは Amazon S3 にアーカイブされます。
ステップ失敗の根本原因を特定するには、Amazon EC2 インスタンスにステップログをダウンロードします。次に、警告とエラーを検索します。次の手順を実行します。
次のコマンドを実行して、ステップログファイルを解凍します。
find . -type f -exec gunzip {} \;
次のコマンドを実行して、クラスターモードログから YARN アプリケーション ID を特定します。
grep "Client: Application report for" * | tail -n 1
次のサンプルファイルはメモリの問題を示しています。
「ERROR SparkContext: 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 コマンドを実行して、メモリを増やしたジョブを送信します。詳細については、Apache Spark ウェブサイトの「Submitting applications」を参照してください。
例
spark-submit --deploy-mode client --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar
クラスターモードのジョブ **
失敗したSparkステップに関連するアプリケーションIDを特定するには、** stderrステップログを確認してください。ステップログは Amazon S3 にアーカイブされます。次に、アプリケーションのプライマリログを特定します。クラスターモードで実行される 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
アプリケーションのプライマリログを特定したら、そのログを Amazon EC2 インスタンスにダウンロードします。次に、警告とエラーを検索します。
次のコマンドを実行して、ステップログファイルを解凍します。
find . -type f -exec gunzip {} \;
コンテナログの警告とエラーを検索するには、次のコマンドの出力にあるコンテナログを開きます。
egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"
コンテナログにメモリの問題が示されている場合は、次の spark-submit コマンドを実行して、メモリを増やしたジョブを送信します。
spark-submit --deploy-mode cluster --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar 1000
Amazon EKS での Amazon EMR の失敗した Spark ジョブのトラブルシューティング
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Spark ジョブが Amazon EKS での Amazon EMR に送信されると、ログを Amazon S3 または CloudWatch に保存できるようになります。ドライバーログで、失敗した Spark ジョブがないか確認してください。また、kubectl コマンドを使用して、実行中の Spark ジョブの driver ログと executor ログに関する詳細情報を取得します。
注: Kubectl コマンドはアクティブなポッドでのみ機能します。ポッドが停止すると、kubectl コマンドを実行できなくなります。
start-job-run コマンドを使用して Spark ジョブを送信する場合は、次の kubectl コマンドを使用してください。
kubectl get pods -n example-spark-namespace
**注:**example-spark-namespace は、ジョブの起動に使用される Spark 名前空間に置き換えます。
kubectl logs spark-example-pod-driver -n example-spark-namespace -c spark-kubernetes-driver
**注:**example-spark-namespace はジョブの起動に使用される Spark 名前空間に置き換え、example-podはポッド名に置き換えます。
spark-operator コマンドを使用して Spark ジョブを送信する場合は、次の kubectl コマンドを使用してください。
kubectl get pods -n example-spark-namespace
**注:**example-spark-namespace は、ジョブの起動に使用される Spark 名前空間に置き換えます。
kubectl logs example-pod-driver -n example-spark-namespace
**注:****example-pod ** はポッド名に、example-spark-namespace はジョブの起動に使用される Spark 名前空間に置き換えます。
spark-submit コマンドを使用してSparkジョブを送信する場合は、次の kubectl コマンドを使用してください。詳細については、Apache Spark ウェブサイトの「Submitting applications」を参照してください。
kubectl get pods -n example-spark-namespace
**注:**example-spark-namespace は、ジョブの起動に使用される Spark 名前空間に置き換えます。
kubectl logs example-pod-driver -n example-spark-namespace
注:example-spark-namespace はジョブの起動に使用される Spark 名前空間に、example-pod はポッド名に置き換えます。
Amazon EMR Serverlessで失敗した Spark ジョブのトラブルシューティング
Amazon EMR Serverless で Spark ジョブを送信すると、すべてのジョブ実行のログ記録がデフォルトで有効になります。また、お使いの Amazon S3 バケットの Amazon S3 ログ記録を有効にすることもできます。失敗した Spark ジョブのトラブルシューティングを行うには、ジョブ実行の詳細を表示し、ドライバーログファイルオプションを選択します。また、CloudWatch に保存されているログを確認して、失敗した Spark ジョブの根本原因を特定することもできます。
関連情報
関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 7年前lg...
- 質問済み 1日前lg...
- AWS公式更新しました 2年前