如何對嘗試連線到 Glue Data Catalog 時,EMR 工作失敗問題進行疑難排解?

2 分的閱讀內容
0

我的 Amazon EMR 工作無法連線到 AWS Glue Data Catalog。

簡短說明

使用 Apache SparkApache HivePresto/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

若要解決此錯誤,請為相應組態新增所有必要的參數


AWS 官方
AWS 官方已更新 2 年前