Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Glue データカタログに接続しようとしたときに EMR ジョブが失敗した場合のトラブルシューティング方法を教えてください。
Amazon EMR ジョブが AWS Glue データカタログに接続できません。
簡単な説明
Amazon EMR は、Apache Spark、Apache 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 ユーザーのアクセス許可を確認します。
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
それぞれの構成に必要なすべてのパラメータを追加することで、エラーを解決します。
関連するコンテンツ
- 質問済み 1年前
- 質問済み 8年前
