我的 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 的账户与 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
要解决此错误,请为相应的配置添加所有必需的参数。