AWS Glue の「Command failed with exit code 1」(終了コード 1 でコマンドが失敗しました) エラーのトラブルシューティング方法を教えてください。

所要時間3分
0

AWS Glue ジョブが失敗し、「Command failed with exit code 1」(終了コード 1 でコマンドが失敗しました) というメッセージが表示されます。

簡単な説明

「Command failed with exit code X」(終了コード X でコマンドが失敗しました) は、AWS Glue アプリケーションがシャットダウンされたときに返される一般的なエラーメッセージです。このエラーは、次の 1 つ以上の条件に当てはまる場合に発生します。

  • AWS Glue ジョブのドライバーまたはエグゼキューターがメモリ不足になった。
  • ジョブスクリプトにコード関連の問題がある。
  • AWS Identity and Access Management (AWS IAM) ロールに、スクリプトパスにアクセスするのに必要な権限がない。

このエラーをさらに調査するには、Amazon CloudWatch のログとメトリクスを確認してください。

解決方法

AWS Glue Spark ジョブが「Command failed with exit code 1」(終了コード 1 でコマンドが失敗しました) というエラーで失敗し、CloudWatch ログには「java.lang.OutOfMemoryError: Java heap space」(java.lang.OutOfMemoryError: Java ヒープの容量) エラーが表示される

この AWS Glue エラーは、ジョブのドライバーまたはエグゼキューターの処理でメモリが不足していることを示しています。ドライバーまたはエグゼキューターがメモリ不足 (OOM) の例外を引き起こしているかどうかを確認するには、glue.driver.jvm.heap.usageglue.executorID.heap.usage の CloudWatch メトリクスを確認してください。詳細については、「Amazon CloudWatch メトリクスによる AWS Glue のモニタリング」を参照してください。

ドライバーが原因で発生する OOM 例外をトラブルシューティングするには、AWS Glue Spark ジョブの「java.lang.OutOfMemoryError: Java heap space」(java.lang.OutOfMemoryError: Java ヒープの容量) エラーを解決する方法を教えてください」および「ドライバーの OOM 例外のデバッグ」を参照してください。

エグゼキューターが原因で発生する OOM 例外をトラブルシューティングするには、「エグゼキューターの OOM 例外のデバッグ」を参照してください。

エグゼキューターが「Command failed with exit code 1」(終了コード 1 でコマンドが失敗しました) というメッセージで失敗する

このエラーは、AWS Glue ジョブをキャンセルしたときに発生します。また、エグゼキューターを強制的にシャットダウンし、ドライバーが終了した場合にも発生します。エラーの詳細については、AWS Glue の CloudWatch ログを確認してください。

AWS Glue バージョン 0.9/1.0 Spark ジョブが「Command failed with exit code 1」(終了コード 1 でコマンドが失敗しました) というエラーで失敗し、CloudWatch ログに「Container killed by YARN for exceeding memory limits」(メモリ制限を超えたため YARN によってコンテナが強制終了されました) というエラーが記録される

: AWS Glue バージョン 1.0 の Spark ジョブのサポートは終了しました。Glue 2.0 以降にアップグレードすると、パフォーマンスが向上します。

この AWS Glue エラーは、エグゼキューターが原因で OOM 例外が発生していることを示しています。このエラーをトラブルシューティングするには、「エグゼキューターの OOM 例外のデバッグ」を参照してください。

AWS Glue Python Shell ジョブが「Command failed with exit code 1」(終了コード 1 でコマンドが失敗しました) というエラーで失敗する

このエラーは、AWS Glue IAM ロールに Amazon Simple Storage Service (Amazon S3) パスから AWS Glue スクリプトにアクセスする権限がないことを示しています。AWS Glue IAM ロールがスクリプトのロケーションパスにアクセスするために必要な権限を確認します。次に、これらの権限を IAM ロールにアタッチします。

AWS Glue ジョブが「Command failed with exit code 1」(終了コード 1 でコマンドが失敗しました) というエラーで失敗し、起動しない

CloudWatch ジョブのログに Amazon S3 に関連するエラーがないか確認します。ログには、次のようなエラーが表示される場合があります。

com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied' Request ID: xxxxxxxxxxxxx)

このエラーは、AWS Glue IAM ロールに Amazon S3 パスから AWS Glue ETL スクリプトにアクセスする権限がない場合に発生します。AWS Glue IAM ロールがスクリプトのロケーションパスにアクセスするために必要な権限を確認します。次に、これらの権限を IAM ロールにアタッチします。

AWS Glue ジョブが「Command failed with exit code 10」(終了コード 10 でコマンドが失敗しました) というエラーで失敗し、正しい IAM および S3 バケット権限があっても CloudWatch ログにエラーが表示されることがある

com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied' Request ID: xxxxxxxxxxxxx)

この AWS Glue エラーは AWS Glue バージョン 3.0 または 4.0 で発生します。このエラーは、AWS Glue セキュリティ設定を使用しているのに、S3 バケットポリシーが暗号化されていない se:putObject を拒否している場合に発生します。

この問題を解決するには、スクリプトの先頭で job.init() を実行して AWS Glue のセキュリティ設定を有効にします。job.init() の前に Spark セッションを開始すると、Spark のセキュリティ設定プロパティがオーバーライドされ、エラーが発生します。

次の例を参照してください。

job = Job(glueContext)
job.init(args["JOB_NAME"], args)

#Use one of the following depending on whether Spark configuration is being set or not
spark = glueContext.spark_session
spark = glueContext.spark_session.builder.enableHiveSupport().config("hive.exec.dynamic.partition","true").config("hive.exec.dynamic.partition.mode", "nonstrict").getOrCreate()

AWS Glue のセキュリティ設定の詳細については、「クローラー、ジョブ、および開発エンドポイントによって書き込まれたデータの暗号化」を参照してください。

AWS Glue ジョブが「Command failed with exit code X」(終了コード X でコマンドが失敗しました) というエラーで失敗し、JAR ファイルがジョブに渡される

CloudWatch ログに次のいずれかのエラーが表示される場合があります。

「Exception in thread "main" java.lang.NoSuchMethodError」(スレッド「main」java.lang.NoSuchMethodError で例外が発生しました)

「Exception in thread "main” java.lang.ExceptionInInitializerError」(スレッド「main」java.lang.ExceptionInInitializerError で例外が発生しました)

これらのエラーは、JAR 依存関係の競合または Spark のバージョンの競合を示しています。JAR 実行ファイルと、ジョブで渡される余分な JAR ファイルに競合がないか確認してください。複数の JAR ファイルを渡す場合は、1 つずつ JAR ファイルを削除して、AWS Glue ジョブを再実行してください。これにより、問題の原因となっているファイルを隔離できます。


関連情報

Apache Spark ウェブ UI を使用したジョブの監視

AWS Glue ETL ジョブが「Container killed by YARN for exceeding memory limits」(メモリ制限を超えたため YARN によってコンテナが強制終了されました) というエラーで失敗するのはなぜですか?

AWS公式
AWS公式更新しました 3年前
コメントはありません

関連するコンテンツ