スキップしてコンテンツを表示

Glue データカタログに接続しようとしたときに EMR ジョブが失敗した場合のトラブルシューティング方法を教えてください。

所要時間2分
0

Amazon EMR ジョブが AWS Glue データカタログに接続できません。

簡単な説明

Amazon EMR は、Apache SparkApache HivePresto/Trino の使用時に、データカタログを永続的なメタストアとして使用します。データカタログは、複数のクラスター、サービス、アプリケーション、AWS アカウント間で共有できます。

ただし、次の要因でデータカタログに接続できなくなる場合があります。

  • Glue データカタログへのアクセス許可が不足している。
  • テーブルロケーションとして指定された Amazon Simple Storage Service (Amazon S3) オブジェクトに対するアクセス許可が不足している。
  • 暗号化されたオブジェクトの AWS Key Management Service (AWS KMS) サービスに対するアクセス許可が不足している。
  • AWS Lake Formation のアクセス許可が不足している。
  • EMR クラスターのパラメータ設定が欠落しているか、誤っている。
  • クエリの形式が誤っている。

解決策

EC2 インスタンスプロファイルで、データカタログまたは S3 バケットに対するアクセス許可が不足している

同じアカウントまたは複数のアカウントからデータカタログにアクセスするには、次のユーザーに AWS Glue アクションと S3 バケットへのアクセス許可が必要です。

  • Amazon Elastic Compute Cloud (Amazon EC2) インスタンスプロファイル。
  • データカタログを呼び出す AWS Identity and Access Management (IAM) ロール。

アクセス許可が欠けている場合、次のようなエラーが発生します。

Unable to verify existence of default database: com.amazonaws.services.glue.model.AccessDeniedException:
User: arn:aws:sts::Acct-id:assumed-role/Role/instance-id is not authorized to perform: glue:GetDatabase on resource: arn:aws:glue:region:Acct-id:catalog because no identity-based policy allows the glue:GetDatabase action
(Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: request-id; Proxy: null

同じアカウントからデータカタログにアクセスする際の問題をトラブルシューティングするには、インスタンスプロファイルまたは IAM ユーザーのアクセス許可を確認します。

Data Catalog のクロスアカウントにアクセスする際の問題をトラブルシューティングするには、発信側アカウントのすべてのアクセス許可および、設定を確認します。次に、クロスアカウント S3 アクセスが付与されていることを確認します。

EC2 インスタンスプロファイルに必要な AWS KMS アクセス許可が欠けている

データカタログがカスタマーマネージドキーを使用して暗号化されている場合、EC2 インスタンスプロファイルにはキーへのアクセスに必要なアクセス許可が必要です。アクセス許可が欠けている場合、次のようなエラーが表示される場合があります。Spark シェル、Hive CLI、Presto/Trino CLI を使用している場合、EMR コンソールにエラーが表示されます。コードをプログラムで送信する場合、コンテナログにエラーが表示されます。

Caused by: MetaException(message:User: arn:aws:sts::acct-id:assumed-role/Role/instance-id is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:region:acct-id:key/fe90458f-beba-460e-8cae-25782ea9f8b3 because no identity-based policy allows the kms:GenerateDataKey action (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: request-id; Proxy: null)
(Service: AWSGlue; Status Code: 400; Error Code: GlueEncryptionException; Request ID: request-id; Proxy: null))

上記のエラーを回避するには、キーへのアクセスに必要な AWS KMS アクセス許可を追加します。

サービスを呼び出す側の AWS アカウントが、データカタログが置かれたアカウントと同じでない場合は、次の手順を実行します。

  • 呼び出し側の AWS アカウントがデータカタログと同じリージョンにある場合は、キー共有を有効にします。
  • マルチリージョンアクセスでは、他のアカウントと共有するためのマルチリージョンキーを作成します。

インスタンスプロファイルが AWS Lake Formation にアクセスできないか、Glue テーブルに必要なアクセス許可がない

データカタログのアクセス許可が AWS Lake Formation で管理または登録されている場合、ロールにはオブジェクトに対する Lake Formation アクセス許可が必要です。ロールに Lake Formation アクセス許可がない場合、次のエラーが表示される場合があります。

pyspark.sql.utils.AnalysisException: Unable to verify existence of default database: com.amazonaws.services glue.model.AccessDeniedException:
Insufficient Lake Formation permission(s) on default (Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: request-id; Proxy: null)

上記のエラーを解決するには、必要なアクセス許可を EC2 インスタンスプロファイルのロールに追加します。次に、テーブルのアクセス許可に加え、Glue テーブルまたはデータベースに対するアクセス許可を付与します。

EMR クラスターの構成が適切でないか、クエリ文字列が誤っている

アクセス許可は正しいが構成が誤っている場合は、クロスアカウントで Glue へのアクセスを試みると、Spark シェルに次のエラーが表示されます。

An error occurred (EntityNotFoundException) when calling the GetTables operation: Database db-name not found.

または

org.apache.spark.sql.AnalysisException: Table or view not found: acct-id/db.table-name line 2 pos 14

それぞれの構成に必要なすべてのパラメータを追加することで、エラーを解決します。


AWS公式更新しました 3年前