嘗試連線到 Glue Data Catalog 時,如何疑難排解 EMR 任務失敗的問題?
上次更新日期:2023 年 1 月 26 日
我的 Amazon EMR 任務無法連接到 AWS Glue Data Catalog。
簡短描述
使用 Apache Spark、Apache Hive 或 Presto/Trino 時,Amazon EMR 使用 Data Catalog 作為持久的中繼存放區。您可以在不同的叢集、服務、應用程式或 AWS 帳戶之間共享 Data Catalog。
但是,與 Data Catalog 的連線可能會因下列原因而失敗:
- Glue Data Catalog 的許可不足。
- 指定為資料表位置的 Amazon Simple Storage Service (Amazon S3) 物件的許可不足。
- 加密物件的 AWS Key Management Service (KMS) 服務的許可不足。
- AWS Lake Formation 的許可不足。
- EMR 叢集參數配置遺失或不正確。
- 查詢格式不正確。
解決方案
EC2 執行個體設定檔沒有 Data Catalog 或 S3 儲存貯體的足夠許可
若要從相同帳戶或跨帳戶存取 Data Catalog,下列項目必須具有 AWS Glue 動作和 S3 儲存貯體的許可:
- Amazon Elastic Compute Cloud (Amazon EC2) 執行個體設定檔。
- 呼叫 Data Catalog 的 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
若要疑難排解從相同帳戶存取 Data Catalog 時發生的問題,請檢查執行個體設定檔或 IAM 使用者的許可。
若要疑難排解跨帳戶存取 Data Catalog 的問題,請檢查呼叫帳戶和組態的所有許可。然後,確認已提供跨帳戶 S3 存取。
EC2 執行個體設定檔沒有必要的 AWS KMS 許可
如果使用客戶自管金鑰加密 Data Catalog,則 EC2 執行個體設定檔必須具有存取金鑰的必要許可。如果遺失許可,則您可能會看到類似下列內容的錯誤。如果您正在使用 spark-shell、Hive CLI 或 Presto/Tritino 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 帳戶與 Data Catalog 存在的帳戶不同,請執行下列動作:
執行個體設定檔無法存取 AWS Lake Formation,或者 Glue 資料表沒有必要的授權
在 AWS Lake Formation 中管理或註冊 Data Catalog 許可後,該角色必須擁有物件的 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
若要解決此錯誤,請為對應的組態新增所有必要的參數。