将 AWS Glue 数据目录用作 Hive 元存储。
使用 Amazon EMR 发行版 5.8.0 或更高版本,您可以将 Hive 配置为使用 AWS Glue 数据目录作为元存储。当您需要持久的元数据仓或由不同集群、服务、应用程序和 AWS 账户共享的元数据仓时,我们建议使用此配置。
AWS Glue 是一项完全托管式提取、转换和加载(ETL)服务,使您能够轻松且经济高效地对数据进行分类、清理和扩充,并在各种数据存储之间可靠地移动数据。AWS Glue 数据目录跨各种数据源和数据格式提供统一的元数据存储库,从而不仅与 Amazon EMR 集成,还与 Amazon RDS、Amazon Redshift、Redshift Spectrum、Athena 以及任何与 Apache Hive 元存储兼容的应用程序集成。AWSGlue 爬网程序能够自动从 Amazon S3 源数据推断架构,从而将关联的元数据存储在数据目录中。有关数据目录的更多信息,请参阅《AWS Glue 开发人员指南》中的填充 AWS Glue 数据目录。
使用 AWS Glue 需单独付费。在数据目录中存储和访问数据需按月付费;为 AWS Glue ETL 作业和爬网程序运行时按小时费率付费(按分计费);为每个预置的开发端点支付每小时费率(按分计费)。数据目录让您最多可免费存储一百万个对象。如果您存储一百万个以上的对象,将需要为超过一百万的每 100,000 个对象支付 1 美元。数据目录中的对象为表、分区或数据库。有关更多信息,请参阅 Glue 定价
重要
如果您在 2017 年 8 月 14 日之前使用 Amazon Athena 或 Amazon Redshift Spectrum 创建了表,则数据库和表将存储在 Athena 托管式目录中,该目录与 AWS Glue 数据目录相互独立。要将 Amazon EMR 与这些表集成,您必须升级到 AWS Glue 数据目录。有关更多信息,请参阅《Amazon Athena 用户指南》中的升级到 AWS Glue 数据目录。
指定 AWS Glue 数据目录作为元存储
您可以使用AWS Management Console、AWS CLI 或 Amazon EMR API 指定 AWS Glue 数据目录作为元存储。在使用 CLI 或 API 时,您可以使用 Hive 配置分类指定数据目录。此外,使用 Amazon EMR 5.16.0 及更高版本时,您可以使用配置分类指定其他 AWS 账户中的数据目录。在使用控制台时,您可以使用 Advanced Options (高级选项) 或 Quick Options (快速选项) 指定数据目录。
IAM 权限
集群的 EC2 实例配置文件必须具有适用于 AWS Glue 操作的 IAM 权限。此外,如果您为 AWS Glue 数据目录对象启用加密,还必须允许该角色加密、解密和生成用于加密的AWS KMS key。
适用于 AWS Glue 操作的权限
如果使用适用于 Amazon EMR 默认的 EC2 实例配置文件,则无需执行任何操作。附加到 EMR_EC2_DefaultRole
的 AmazonElasticMapReduceforEC2Role
托管式策略允许所有必要 AWS Glue 操作。但是,如果您指定自定义 EC2 实例配置文件和权限,则必须配置合适的 AWS Glue 操作。使用 AmazonElasticMapReduceforEC2Role
托管策略作为起点。如需了解更多信息,请参阅《Amazon EMR 管理指南》中的集群 EC2 实例的服务角色(EC2 实例配置文件)。
用于加密和解密 AWS Glue 数据目录的权限
您的实例配置文件需要使用密钥加密和解密数据的权限。如果以下语句适用,您不必配置这些权限:
-
您使用 AWS Glue 的托管式密钥启用 AWS Glue Data Catalog 对象的加密。
-
您使用的是同一AWS 账户的集群,其作为 AWSGlue Data Catalog。
否则,您必须将以下语句添加到附加到 EC2 实例配置文件的权限策略。
[ { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:
region
:acct-id
:key/12345678-1234-1234-1234-123456789012
" } ] } ]
有关 AWS Glue 数据目录加密的更多信息,请参阅《AWS Glue 开发人员指南》中的加密您的数据目录。
基于资源的权限
如果您将 AWS Glue 与 Amazon EMR 中的 Hive、Spark 或 Presto 结合使用,AWS Glue 支持使用基于资源的策略来控制对数据目录资源的访问权限。这些资源包括数据库、表、连接和用户定义的函数。有关更多信息,请参阅《AWS Glue 开发人员指南》中的 AWS Glue 资源策略。
当使用基于资源的策略来限制从 Amazon EMR 中访问 AWS Glue 时,在权限策略中指定的委托人必须是与创建集群时指定的 EC2 实例配置文件相关联的角色 ARN。例如,对于附加到目录的基于资源的策略,您可以使用以下示例中显示的格式为集群 EC2 实例的默认服务角色指定角色 ARN,将 EMR_EC2_DefaultRole
指定为 Principal
:
arn:aws:iam::
acct-id
:role/EMR_EC2_DefaultRole
acct-id
可以与 AWS Glue 账户 ID 不同。这允许从不同账户中的 EMR 集群进行访问。您可以指定多个委托人,且每个委托人都可以来自不同的账户。
使用 AWS Glue 数据目录时的注意事项
在将 AWS Glue 数据目录用作 Hive 的元存储时,请考虑以下项目:
-
不支持使用 Hive Shell 添加辅助 JAR。作为解决方法,请使用
hive-site
配置分类来设置hive.aux.jars.path
属性,它会将辅助 JAR 添加到 Hive 类路径中。 -
不支持 Hive 事务
。 不支持在 AWS Glue 中重命名表。
当您创建 Hive 表而不指定
LOCATION
时,表数据存储在通过hive.metastore.warehouse.dir
属性指定的位置。默认情况下,这是 HDFS 中的一个位置。如果另一个集群需要访问该表,则它将失败,除非它有足够的权限访问创建该表的集群。此外,由于 HDFS 存储是暂时性的,因此如果集群终止,表数据将丢失,并且必须重新创建该表。建议您在使用 AWS Glue 创建 Hive 表时,指定 Amazon S3 中的一个LOCATION
。此外,也可以使用hive-site
配置分类来为hive.metastore.warehouse.dir
指定 Amazon S3 中的位置,它适用于所有 Hive 表。如果表在 HDFS 位置创建,并且创建该表的集群仍在运行,您可以在 AWS Glue 中更新 Amazon S3 中表的位置。有关更多信息,请参阅《AWS Glue 开发人员指南》中的使用 AWS Glue 控制台上的表。不支持包含引号和撇号的分区值,例如
PARTITION (owner="Doe's").
emr-5.31.0 及更高版本支持列统计数据
。 不支持使用 Hive 授权
。作为替代方案,考虑使用基于 AWS Glue 资源的策略。有关更多信息,请参阅将用于 Amazon EMR 访问的基于资源的策略用于 AWS Glue 数据目录。 不支持 Hive 约束
。 不支持 Hive 中基于成本的优化
。 不支持设置
hive.metastore.partition.inherit.table.properties
。不支持使用以下元存储常量:
BUCKET_COUNT, BUCKET_FIELD_NAME, DDL_TIME, FIELD_TO_DIMENSION, FILE_INPUT_FORMAT, FILE_OUTPUT_FORMAT, HIVE_FILTER_FIELD_LAST_ACCESS, HIVE_FILTER_FIELD_OWNER, HIVE_FILTER_FIELD_PARAMS, IS_ARCHIVED, META_TABLE_COLUMNS, META_TABLE_COLUMN_TYPES, META_TABLE_DB, META_TABLE_LOCATION, META_TABLE_NAME, META_TABLE_PARTITION_COLUMNS, META_TABLE_SERDE, META_TABLE_STORAGE, ORIGINAL_LOCATION
。使用谓词表达式时,显式值必须位于比较运算符的右侧,否则查询可能会失败。
正确:
SELECT * FROM mytable WHERE time > 11
错误:
SELECT * FROM mytable WHERE 11 > time
Amazon EMR 5.32.0 和 6.3.0 及更高版本支持在谓词表达式中使用用户定义的函数 (UDF)。使用早期版本时,查询可能因 Hive 尝试优化查询执行的方式而失败。
不支持临时表
。 建议通过 Amazon EMR 使用应用程序创建表,而不是直接使用 AWS Glue 创建。通过 AWS Glue 创建表可能会导致必填字段丢失,并导致查询异常。
在 EMR 5.20.0 或更高版本中,当使用 AWS Glue 数据目录作为元存储时,会自动为 Spark 和 Hive 启用并行分区修剪。此更改通过并行执行多个请求来检索分区,显著缩短查询计划时间。可同时执行的分段总数介于 1 到 10 之间。默认值为 5,这是建议的设置。您可以通过以下方式更改该值:指定
hive-site
配置分类中的属性aws.glue.partition.num.segments
。如果发生节流,则可以通过将值更改为 1 来关闭此功能。有关更多信息,请参阅 AWS Glue 分段结构。