嘗試連線到 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/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 帳戶與 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

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


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