如何对在尝试连接到 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 官方已更新 2 年前