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

所要時間2分
0

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

簡単な説明

Amazon EMR は、 Apache SparkApache Hive、または Presto/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 ユーザーのアクセス権限を確認してください。

データカタログのクロスアカウントにアクセスする際の問題のトラブルシューティングを行うには、呼び出し元アカウントと設定のすべてのアクセス権限を確認してください。次に、クロスアカウント S3 アクセスが提供されていることを確認します。

EC2 インスタンスプロファイルに、必要な AWS KMS 権限がない

データカタログがカスタマー管理キーを使用して暗号化されている場合、EC2 インスタンスプロファイルにはキーにアクセスするための権限が必要です。権限がない場合、次のようなエラーが表示されることがあります。spark-shell、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-shell に次のエラーが表示されます。

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公式
AWS公式更新しました 1年前