如何排查在尝试连接到 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(AWS 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 表没有所需的授权

在 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 年前