将 AWS Glue 数据目录用作 Hive 元存储。 - Amazon EMR

将 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 (快速选项) 指定数据目录。

Console
使用控制台指定 AWS Glue Data Catalog 作为 Hive 元存储
  1. 登录 AWS Management Console 并打开 Amazon EMR 控制台,网址为 https://console.aws.amazon.com/emr

  2. 在左侧导航窗格中的 EMR on EC2 下,选择 Clusters(集群),然后选择 Create cluster(创建集群)。

  3. Application bundle(应用程序包)下,选择 Core Hadoop(核心 Hadoop)、HBaseCustom(自定义)。如果您自定义集群,请确保选择 Hive 或 HCatalog 作为应用程序之一。

  4. AWS Glue 数据目录设置下,选择用于 Hive 表元数据复选框。

  5. 选择适用于集群的任何其他选项。

  6. 要启动集群,选择 Create cluster(创建集群)。

CLI
使用 AWS CLI 指定 AWS Glue 数据目录作为 Hive 元存储

有关使用 AWS CLI 和 EMR API 指定配置分类的更多信息,请参阅配置应用程序

  • 使用 hive-site 配置分类指定 hive.metastore.client.factory.class 的值,如下例所示:

    [ { "Classification": "hive-site", "Properties": { "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } } ]

    在 EMR 发行版本 5.28.0、5.28.1、5.29.0 或 6.x 中,如果您要将 AWS Glue 数据目录用作元数据来创建集群,请将 hive.metastore.schema.verification 设置为 false。这可以防止 Hive 和 HCatalog 根据 MySQL 验证元数据仓架构。如果没有此配置,主实例组将在 Hive 或 HCatalog 上进行重新配置后暂停。

    [ { "Classification": "hive-site", "Properties": { "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory", "hive.metastore.schema.verification": "false" } } ]

    如果您在 EMR 发行版 5.28.0、5.28.1 或 5.29.0 上已有集群,则可以使用以下信息将主实例组 hive.metastore.schema.verification 设置为 false

    Classification = hive-site Property = hive.metastore.schema.verification Value = false

    要在其他AWS账户中指定数据目录,请添加 hive.metastore.glue.catalogid 属性,如以下示例所示。将 acct-id 替换为数据目录的AWS账户。

    [ { "Classification": "hive-site", "Properties": { "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory", "hive.metastore.schema.verification": "false", "hive.metastore.glue.catalogid": "acct-id" } } ]

IAM 权限

集群的 EC2 实例配置文件必须具有适用于 AWS Glue 操作的 IAM 权限。此外,如果您为 AWS Glue 数据目录对象启用加密,还必须允许该角色加密、解密和生成用于加密的AWS KMS key。

适用于 AWS Glue 操作的权限

如果使用适用于 Amazon EMR 默认的 EC2 实例配置文件,则无需执行任何操作。附加到 EMR_EC2_DefaultRoleAmazonElasticMapReduceforEC2Role 托管式策略允许所有必要 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 分段结构