我的 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/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 帳戶與 Data Catalog 所在的帳戶不同,請執行下列操作:
- 如果呼叫 AWS 帳戶與 Data Catalog 位於同一區域,則請啟用金鑰共用。
- 對於多區域存取,請建立多區域金鑰以便與其他帳戶共用。
執行個體設定檔無權存取 AWS Lake Formation,或 Glue 表沒有所需的授權
當 Data Catalog 權限由 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
若要解決此錯誤,請為相應組態新增所有必要的參數。