エラーのトラブルシューティング Spark エラー - AWS Glue
エラー: リソースを利用できません。エラー: VPC の subnetId に S3 エンドポイントまたは NAT ゲートウェイが見つかりませんでしたエラー: 必要なセキュリティグループのインバウンドルールエラー: 必要なセキュリティグループのアウトバウンドルールエラー: ジョブの実行に失敗しました、渡されたロールには AWS Glue サービスでロールを引き受けるためのアクセス許可が必要ですエラー:DescribeVpcEndpoints アクションは許可されていません。VPC ID を検証できません vpc-idエラー:DescribeRouteTables アクションは許可されていません。VPC id (vpc-id) の Subnet Id (Subnet id) を検証できません。エラー: ec2:DescribeSubnets の呼び出しに失敗しましたエラー: ec2:DescribeSecurityGroups の呼び出しに失敗しましたエラー: AZ のサブネットが見つかりませんでしたエラー: JDBC ターゲットへの書き込み時のジョブ実行の例外Error: Amazon S3: The operation is not valid for the object's storage classエラー:Amazon S3 タイムアウトエラー: Amazon S3 へのアクセスが拒否されましたエラー: Amazon S3 のアクセスキー ID が存在しませんエラー: URI に s3a:// を使用しながら Amazon S3 にアクセスするとジョブ実行が失敗しますエラー: Amazon S3 のサービストークンが有効期限切れですエラー: ネットワークインターフェイスのプライベート DNS が見つかりませんエラー: 開発エンドポイントのプロビジョニングに失敗しましたエラー: ノートブックサーバー CREATE_FAILEDエラー: ローカルノートブックの起動に失敗するエラー: クローラの実行に失敗しましたエラー: パーティションが更新されませんでしたError: Job bookmark update failed due to version mismatch (エラー: バージョンの不一致のため、ジョブのブックマークの更新に失敗しました)エラー : ジョブのブックマークが有効なときにジョブがデータを再処理していますエラー: AWS Glue 内の VPC 間のフェイルオーバー動作

エラーのトラブルシューティング Spark エラー

AWS Glue でエラーが発生した場合は、次の情報を使用して問題の原因を突き止めて修正してください。

注記

AWS Glue GitHub リポジトリには AWS Glue に関するよくある質問のトラブルシューティングガイダンスの詳細が含まれています。

トピック

エラー: リソースを利用できません。

AWS Glue がリソース使用不可メッセージを返す場合は、エラーメッセージやログを表示して、問題の詳細を確認することができます。ここでは、トラブルシューティングするための一般的な方法について説明します。

  • 使用する接続および開発エンドポイントについては、クラスターに Elastic Network Interface が不足していないかどうかを確認してください。

エラー: VPC の subnetId に S3 エンドポイントまたは NAT ゲートウェイが見つかりませんでした

問題の診断に役立つメッセージのサブネット ID と VPC ID を確認します。

  • AWS Glue に必要な Amazon S3 VPC エンドポイントがセットアップ済みであることを確認してください。さらに、設定の一部である場合には、NAT ゲートウェイを確認します。詳細については、Amazon S3 用の VPC エンドポイント を参照してください。

エラー: 必要なセキュリティグループのインバウンドルール

少なくとも 1 つのセキュリティグループのすべての受信ポートを開く必要があります。トラフィックを制限するために、インバウンドルールのソースセキュリティグループを同じセキュリティグループに制限できます。

エラー: 必要なセキュリティグループのアウトバウンドルール

少なくとも 1 つのセキュリティグループのすべての発信ポートを開く必要があります。トラフィックを制限するために、アウトバウンドルールのソースセキュリティグループを同じセキュリティグループに制限できます。

エラー: ジョブの実行に失敗しました、渡されたロールには AWS Glue サービスでロールを引き受けるためのアクセス許可が必要です

ジョブを定義するユーザーは AWS Glue の iam:PassRole のアクセス権限を持っている必要があります。

エラー:DescribeVpcEndpoints アクションは許可されていません。VPC ID を検証できません vpc-id

  • ec2:DescribeVpcEndpoints アクセス権限用に、AWS Glue に渡されたポリシーを確認してください。

エラー:DescribeRouteTables アクションは許可されていません。VPC id (vpc-id) の Subnet Id (Subnet id) を検証できません。

  • ec2:DescribeRouteTables アクセス権限用に、AWS Glue に渡されたポリシーを確認してください。

エラー: ec2:DescribeSubnets の呼び出しに失敗しました

  • ec2:DescribeSubnets アクセス権限用に、AWS Glue に渡されたポリシーを確認してください。

エラー: ec2:DescribeSecurityGroups の呼び出しに失敗しました

  • ec2:DescribeSecurityGroups アクセス権限用に、AWS Glue に渡されたポリシーを確認してください。

エラー: AZ のサブネットが見つかりませんでした

  • アベイラビリティーゾーンは、AWS Glue では使用できない場合があります。メッセージで指定されているものとは異なるアベイラビリティーゾーンに新しいサブネットを作成して使用します。

エラー: JDBC ターゲットへの書き込み時のジョブ実行の例外

JDBC ターゲットに書き込むジョブを実行すると、以下のシナリオのようにジョブでエラーが発生する可能性があります。

  • ジョブが Microsoft SQL Server テーブルに書き込む場合、テーブルに Boolean 型として定義された列がある場合には、SQL Server データベースでテーブルを事前に定義する必要があります。SQL Server ターゲットを使用して AWS Glue コンソールでジョブを定義し、[Create tables in your data target (データターゲットでテーブルを作成する)] オプションを使用する場合は、データ型が Boolean であるターゲット列にソース列をマッピングしないでください。ジョブの実行時にエラーが発生する可能性があります。

    次のようにして、エラーを回避できます。

    • [Boolean (ブール)] 列を使用して既存のテーブルを選択します。

    • ApplyMapping 変換を編集し、ソース内の [Boolean] (ブール) 列をターゲット内の数値または文字列にマップします。

    • ApplyMapping 変換を編集して、[Boolean] (ブール) 列をソースから削除します。

  • ジョブが Oracle テーブルに書き込む場合は、Oracle オブジェクトの名前の長さを調整する必要があります。Oracle の一部のバージョンでは、識別子の最大長は 128 バイトまたは 30 バイトに制限されています。この制限は、Oracle ターゲットデータストアのテーブル名および列名に影響を与えます。

    次のようにして、エラーを回避できます。

    • ご使用のバージョンの制限内で Oracle ターゲットテーブルに名前を付けます。

    • デフォルトの列名は、データのフィールド名から生成されます。列名が制限よりも長い場合は処理のために、ApplyMapping または RenameField 変換を使用して列の名前を制限内に変更します。

Error: Amazon S3: The operation is not valid for the object's storage class

AWS Glue がこのエラーを返した場合、AWS Glue ジョブは Amazon S3 ストレージクラス層にまたがるパーティションを持つテーブルからデータを読み取っていた可能性があります。

  • ストレージクラスの除外を使用することで、これらのストレージクラス層にまたがるパーティションを持つテーブルで AWS Glue ジョブを確実に動作させることができます。除外しないと、これらの階層からデータを読み取るジョブは AmazonS3Exception: The operation is not valid for the object's storage class のエラーで失敗します。

    詳細については、「Amazon S3 ストレージクラスの除外」を参照してください。

エラー:Amazon S3 タイムアウト

AWS Glue が接続タイムアウトエラーを返す場合は、別の AWS リージョンの Amazon S3 バケットにアクセスしようとしている可能性があります。

  • Amazon S3 の VPC エンドポイントは、AWS リージョン内のバケットにのみトラフィックをルーティングできます。他のリージョンのバケットに接続する必要がある場合、考えられる回避策は NAT ゲートウェイを使用することです。詳細については、「NAT ゲートウェイ」を参照してください。

エラー: Amazon S3 へのアクセスが拒否されました

AWS Glue が Amazon S3 バケットまたはオブジェクトへのアクセス拒否エラーを返す場合は、提供された IAM ロールにデータストアへのアクセス許可を持つポリシーがない可能性があります。

  • ETL ジョブは、ソースまたはターゲットとして使用される Amazon S3 データストアにアクセスできる必要があります。クローラは、クロールする Amazon S3 データストアにアクセスできる必要があります。詳細については、ステップ 2: AWS Glue 用の IAM ロールを作成する を参照してください。

エラー: Amazon S3 のアクセスキー ID が存在しません

ジョブの実行中に AWS Glue がアクセスキー ID が存在しないというエラーを返す場合は、次のいずれかの理由が考えられます。

  • ETL ジョブは IAM ロールを使用してデータストアにアクセスし、IAM ロールがそのジョブの開始前に削除されていないことを確認します。

  • IAM ロールには、データストアにアクセスするためのアクセス許可が含まれており、アタッチ済みの s3:ListBucket を含む Amazon S3 ポリシーが正しいことを確認します。

エラー: URI に s3a:// を使用しながら Amazon S3 にアクセスするとジョブ実行が失敗します

ジョブ実行から「XML ドキュメントをハンドラクラスで解析できませんでした」などのエラーが返された場合は、 s3a:// URI を使用して数百のファイルをリストアップしようとして失敗した可能があります。代わりに s3:// URI を使用してデータストアにアクセスしてください。次の例外トレースを調べてエラーを確認できます。

1. com.amazonaws.SdkClientException: Failed to parse XML document with handler class com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser$ListBucketHandler 2. at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:161) 3. at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.parseListBucketObjectsResponse(XmlResponsesSaxParser.java:317) 4. at com.amazonaws.services.s3.model.transform.Unmarshallers$ListObjectsUnmarshaller.unmarshall(Unmarshallers.java:70) 5. at com.amazonaws.services.s3.model.transform.Unmarshallers$ListObjectsUnmarshaller.unmarshall(Unmarshallers.java:59) 6. at com.amazonaws.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:62) 7. at com.amazonaws.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:31) 8. at com.amazonaws.http.response.AwsResponseHandlerAdapter.handle(AwsResponseHandlerAdapter.java:70) 9. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1554) 10. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1272) 11. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056) 12. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) 13. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) 14. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) 15. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) 16. at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) 17. at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) 18. at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4325) 19. at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4272) 20. at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4266) 21. at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:834) 22. at org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:971) 23. at org.apache.hadoop.fs.s3a.S3AFileSystem.deleteUnnecessaryFakeDirectories(S3AFileSystem.java:1155) 24. at org.apache.hadoop.fs.s3a.S3AFileSystem.finishedWrite(S3AFileSystem.java:1144) 25. at org.apache.hadoop.fs.s3a.S3AOutputStream.close(S3AOutputStream.java:142) 26. at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:74) 27. at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:108) 28. at org.apache.parquet.hadoop.ParquetFileWriter.end(ParquetFileWriter.java:467) 29. at org.apache.parquet.hadoop.InternalParquetRecordWriter.close(InternalParquetRecordWriter.java:117) 30. at org.apache.parquet.hadoop.ParquetRecordWriter.close(ParquetRecordWriter.java:112) 31. at org.apache.spark.sql.execution.datasources.parquet.ParquetOutputWriter.close(ParquetOutputWriter.scala:44) 32. at org.apache.spark.sql.execution.datasources.FileFormatWriter$SingleDirectoryWriteTask.releaseResources(FileFormatWriter.scala:252) 33. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:191) 34. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:188) 35. at org.apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1341) 36. at org.apache.spark.sql.execution.datasources.FileFormatWriter$.org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask(FileFormatWriter.scala:193) 37. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1$$anonfun$3.apply(FileFormatWriter.scala:129) 38. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1$$anonfun$3.apply(FileFormatWriter.scala:128) 39. at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 40. at org.apache.spark.scheduler.Task.run(Task.scala:99) 41. at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282) 42. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 43. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 44. at java.lang.Thread.run(Thread.java:748)

エラー: Amazon S3 のサービストークンが有効期限切れです

Amazon Redshift との間でデータを移行する際には、1 時間で有効期限が切れる、Amazon S3 の一時的な認証情報が使用されます。長時間実行するジョブがある場合は、失敗する可能性があります。長時間実行するジョブを設定して Amazon Redshift との間でデータを移動する方法については、「aws-glue-programming-etl-connect-redshift-home」を参照してください。

エラー: ネットワークインターフェイスのプライベート DNS が見つかりません

ジョブが失敗したり、開発エンドポイントがプロビジョニングに失敗した場合は、ネットワーク設定が問題の原因である可能性があります。

  • Amazon が提供する DNS を使用している場合は、enableDnsHostnames の値を true に設定する必要があります。詳細については、「DNS」を参照してください。

エラー: 開発エンドポイントのプロビジョニングに失敗しました

AWS Glue が開発エンドポイントのプロビジョニングに失敗した場合は、ネットワーク設定が問題の原因である可能性があります。

  • 開発エンドポイントを定義すると、VPC、サブネット、およびセキュリティグループが検証され、特定の要件を満たしていることが確認されます。

  • オプションの SSH パブリックキーを指定した場合、有効な SSH パブリックキーになっていることを確認します。

  • VPC コンソールで、VPC が有効な [DHCP option set (DHCP オプションセット)] を使用していることを確認します。詳細については、「DHCP オプションセット」を参照してください。

  • クラスターが PROVISIONING 状態のままになっている場合は、AWS Support にお問い合わせください。

エラー: ノートブックサーバー CREATE_FAILED

AWS Glue が開発エンドポイント用のノートブックサーバーの作成に失敗した場合は、次のいずれかの問題が原因である可能性があります。

  • AWS Glue は、ノートブックサーバーのセットアップ時に、Amazon EC2 に対し IAM ロールを渡します。IAM ロールでは、Amazon EC2 との信頼関係が必要です。

  • IAM ロールには、同じ名前のインスタンスプロファイルが必要です。IAM コンソールで Amazon EC2 のロールを作成すると、同じ名前のインスタンスプロファイルが自動的に作成されます。無効なインスタンスプロファイル名 iamInstanceProfile.name に関するログのエラーをチェックします。詳細については、「インスタンスプロファイルの使用」を参照してください。

  • ロールにノートブックサーバーを作成するために渡したポリシーの aws-glue* バケットにアクセスする権限があることを確認します。

エラー: ローカルノートブックの起動に失敗する

ローカルノートブックの起動に失敗し、ディレクトリまたはフォルダが見つからないというエラーが報告された場合は、次のいずれかの問題が原因である可能性があります。

  • Microsoft Windows で実行している場合は、JAVA_HOME 環境変数が適切な Java ディレクトリを指していることを確認します。この変数を更新せずに Java が更新される可能性があります。存在しなくなったフォルダを変数が指していると、Jupyter Notebook は起動に失敗します。

エラー: クローラの実行に失敗しました

AWS Glue がデータをカタログ化するためにクローラを正常に実行できなかった場合は、次のいずれかの理由が考えられます。まず、AWS Glue コンソールのクローラリストにエラーがあるかどうかを確認します。クローラ名の横に感嘆符 アイコンがあるかどうかを確認し、アイコンの上にカーソルを置いて関連するメッセージを確認します。

  • /aws-glue/crawlers にある CloudWatch Logs で実行されるクローラのログを確認します。

エラー: パーティションが更新されませんでした

ETL ジョブの実行時に Data Catalog でパーティションが更新されなかった場合、CloudWatch のログにある DataSink クラスの次のログステートメントが役に立ちます。

  • Attempting to fast-forward updates to the Catalog - nameSpace:」 — このジョブによって変更しようとしているデータベース、テーブル、および catalogId を示します。このステートメントがここにない場合は、enableUpdateCatalog が true に設定され、getSink() パラメータとして、または additional_options で正しく渡されるかどうかを確認します。

  • Schema change policy behavior:」 — 渡したスキーマ updateBehavior 値を示します。

  • Schemas qualify (schema compare):」 — true または false になります。

  • Schemas qualify (case-insensitive compare):」 — true または false になります。

  • 両方が false であり、updateBehavior UPDATE_IN_DATABASE が設定されていない場合は、DynamicFrame スキーマが同一であるか、このスキーマには、Data Catalog テーブルスキーマに表示される列のサブセットが含まれている必要があります。

パーティションの更新の詳細については、「AWS Glue ETL ジョブを使用してデータカタログのスキーマを更新し、新規パーティションを追加する」を参照してください。

Error: Job bookmark update failed due to version mismatch (エラー: バージョンの不一致のため、ジョブのブックマークの更新に失敗しました)

AWS Glue ジョブをパラメータ化して、Amazon S3 の異なるデータセットに同じ変換/ロジックを適用しようとしている可能性があります。ユーザーは指定の場所で処理されたファイルを追跡したいと考えています。同じソースバケットで同じジョブを実行し、同じ/異なる送信先に同時に書き込んだ場合 (同時実行数 >1)、次のエラーによりジョブは失敗します。

py4j.protocol.Py4JJavaError: An error occurred while callingz:com.amazonaws.services.glue.util.Job.commit.:com.amazonaws.services.gluejobexecutor.model.VersionMismatchException: Continuation update failed due to version mismatch. Expected version 2 but found version 3

解決策として、同時実行数を 1 に設定するか、ジョブを同時に実行しないようにします。

現在、AWS Glue のブックマークは同時ジョブ実行をサポートしておらず、コミットは失敗します。

エラー : ジョブのブックマークが有効なときにジョブがデータを再処理しています

AWS Glue ジョブのブックマークを有効にしてあっても、以前の実行で処理したデータを ETL ジョブで再処理する場合があります。このエラーの一般的な原因を確認します。

最大同時実行数

ジョブの同時実行の最大数をデフォルト値の 1 より大きく設定すると、ジョブのブックマークを妨げる可能性があります。ジョブのブックマークがオブジェクトの最終更新日時を確認し、どのオブジェクトを再処理する必要があるか確認するときに発生します。詳細については、「AWS Glue で Spark ジョブに関するジョブプロパティの構成」の最大同時実行数に関する説明を参照してください。

Job オブジェクトが見つからない

ジョブの実行スクリプトが次のコメントで終わることを確認します。

job.commit()

このオブジェクトを含めると、AWS Glue はジョブ実行のタイムスタンプとパスを記録します。同じパスでジョブを再度実行すると、AWS Glue は新しいファイルのみを処理します。このオブジェクトを含まず、ジョブのブックマークが有効になっている場合、ジョブはすでに処理されたファイルと共に新しいファイルを再処理して、ジョブのターゲットデータストアで冗長化されます。

変換コンテキストパラメータが見つからない

変換コンテキストは、GlueContext クラスのオプションのパラメータですが、ジョブのブックマークは含めなければ機能しません。このエラーを解決するには、以下に示すように DynamicFrame を作成するときに変換コンテキストパラメータを追加します。

sample_dynF=create_dynamic_frame_from_catalog(database, table_name,transformation_ctx="sample_dynF")
入力ソース

入力ソースのリレーショナルデータベース (JDBC 接続) を使用している場合は、テーブルのプライマリキーが順番になっている場合のみジョブのブックマークが機能します。ジョブのブックマークは新しい行に対して機能しますが、更新された行に対しては機能しません。これは、ジョブのブックマークで探すプライマリキーがすでに存在しているからです。これは、入力ソースが Amazon Simple Storage Service (Amazon S3) である場合には適用されません。

最終更新日時

Amazon S3 入力ソースの場合、ジョブのブックマークは、ファイル名ではなくオブジェクトの最終更新日時を確認して、どのオブジェクトを再処理する必要があるのかを確認します。入力ソースデータが最後のジョブ実行以降に変更されている場合、ジョブを再度実行すると、ファイルが再度処理されます。

エラー: AWS Glue 内の VPC 間のフェイルオーバー動作

次のプロセスは、AWS Glue 4.0 以前のバージョンにおけるジョブのフェイルオーバーに使用されます。

概要: AWS Glue 接続は、ジョブ実行の送信時に選択されます。ジョブ実行で何らかの問題 (IP アドレスの不足、ソースへの接続、ルーティングの問題) が発生した場合、ジョブ実行は失敗します。再試行が設定されている場合、AWS Glue は同じ接続で再度実行を試みます。

  1. 実行の試行ごとに、AWS Glue は、使用できる接続が見つかるまで、ジョブ設定に記載されている順序で接続の状態をチェックします。アベイラビリティーゾーン (AZ) に障害が発生した場合、その AZ からの接続はチェックに失敗し、スキップされます。

  2. AWS Glue は次のことを実行して接続を検証します。

    • 有効な Amazon VPC ID とサブネットを確認する。

    • NAT ゲートウェイまたは Amazon VPC エンドポイントが存在することを確認する。

    • サブネットに 0 個を超える IP アドレスが割り当てられていることを確認する。

    • AZ が正常であることを確認する。

    AWS Glue は、ジョブ実行の送信時に接続を確認できません。

  3. Amazon VPC を使用するジョブの場合、すべてのドライバーとエグゼキューターは、ジョブ実行の送信時に選択された接続を使用して同じ AZ に作成されます。

  4. 再試行が設定されている場合、AWS Glue は同じ接続で再度実行を試みます。これは、この接続に関する問題が長時間継続することを保証できないためです。AZ に障害が発生すると、その AZ 内の既存のジョブ実行 (ジョブ実行の段階によって異なる) が失敗する可能性があります。再試行すると AZ の障害が検出され、新しい実行で別の AZ が選択されるはずです。