如何排查在尝试连接到 Glue Data Catalog 时 EMR 作业失败的问题?
上次更新日期:2023 年 1 月 26 日
我的 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(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 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
要解决此错误,请为相应的配置添加所有必要的参数。