View a markdown version of this page

将 Iceberg 集群与 Hive 结合使用 - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 Iceberg 集群与 Hive 结合使用

在 Amazon EMR 发行版 6.9.0 及更高版本中,您可以将 Iceberg 与 Hive 集群结合使用,而无需执行开源 Iceberg Hive 集成所需的设置步骤。对于 Amazon EMR 版本 6.8.0 及更早版本,您可以使用引导操作安装 iceberg-hive-runtime jar 来配置 Hive for Iceberg 支持。

Amazon EMR 6.9.0 包括 Hive 3.1.3 与 Iceberg 0.14.1 集成的所有功能,还包括 Amazon EMR 增加的功能,例如在运行时自动选择支持的执行引擎(EKS 6.9.0 上的 Amazon EMR)。

创建 Iceberg 集群

您可以使用AWS 管理控制台、AWS CLI或 Amazon EMR API 创建安装了 Iceberg 的集群。在本教程中,您将使用在 AWS CLI Amazon EMR 集群上使用 Iceberg。要使用控制台创建安装了 Iceberg 的集群,请按照使用 Amazon Athena、Amazon EMR 和 AWS Glue 构建 Iceberg 数据湖中的步骤操作。

要将 Amazon EMR 上的 Iceberg 与一起AWS CLI使用,请先使用以下步骤创建一个集群。有关使用AWS CLI或 Java SDK 指定 Iceberg 分类的信息,请参阅创建集群 AWS CLI 时使用提供配置在创建集群时,使用 Java SDK 提供配置。使用以下内容创建名为 configurations.json 的文件:

[{ "Classification":"iceberg-defaults", "Properties":{"iceberg.enabled":"true"} }]

接下来,使用以下配置创建集群,将示例 Amazon S3 桶路径和子网 ID 替换为您自己的值:

aws emr create-cluster --release-label emr-6.9.0 \ --applications Name=Hive \ --configurations file://iceberg_configurations.json \ --region us-east-1 \ --name My_hive_Iceberg_Cluster \ --log-uri s3://amzn-s3-demo-bucket/ \ --instance-type m5.xlarge \ --instance-count 2 \ --service-role EMR_DefaultRole \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef

Hive Iceberg 集群执行以下操作:

  • 在 Hive 中加载 Iceberg Hive 运行时 jar 并启用 Hive 引 Iceberg-related 擎的配置。

  • 启用 Amazon EMR Hive 的动态执行引擎选择,以防止用户设置支持的执行引擎实现 Iceberg 兼容性。

注意

Hive Iceberg 集群目前不支持 Glue AWS 数据目录。默认 Iceberg 目录为 HiveCatalog,它对应于为 Hive 环境配置的元存储。有关目录管理的更多信息,请参阅 Apache Hive 文档中的使用 HCatalog

功能支持

Amazon EMR 6.9.0 支持 Hive 3.1.3 和 Iceberg 0.14.1。功能支持仅限于 Hive 3.1.2 和 3.1.3 的 Iceberg-compatible 功能。支持以下   命令:

  • 在 Amazon EMR 发行版 6.9.0 到 6.12.x 版本中,您必须将 libfb303 jar 包含在 Hive auxlib 目录中。使用以下命令将其包含在内:

    sudo /usr/bin/ln -sf /usr/lib/hive/lib/libfb303-*.jar /usr/lib/hive/auxlib/libfb303.jar

    在 Amazon EMR 6.13 及更高版本中,libfb303 jar 会自动符号链接到 Hive auxlib 目录。

  • 创建表

    • Non-partitioned table — Hive 中的外部表可以通过提供存储处理程序来创建,如下所示:

      CREATE EXTERNAL TABLE x (i int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    • 分区表 - 可以在 Hive 中创建外部分区表,如下所示:

      CREATE EXTERNAL TABLE x (i int) PARTITIONED BY (j int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    注意

    Hive 3 ORC/AVRO/PARQUET 不支持STORED AS文件格式。默认且唯一的选项是 Parquet。

  • 删除表 - DROP TABLE 命令用于删除表,如以下示例中所示:

    DROP TABLE [IF EXISTS] table_name [PURGE];
  • 读取表 - SELECT 语句可用于读取 Hive 中的 Iceberg 表,如以下示例中所示。支持的执行引擎为 MR 和 Tez。

    SELECT * FROM table_name

    有关 Hive 的选择语法的信息,请参阅LanguageManual 选择。有关在 Hive 中使用 Iceberg 表的选择语句的信息,请参阅 Apache Iceberg Select

  • 插入到表中 - HiveQL 的 INSERT INTO 语句仅适用于支持 Map Reduce 执行引擎的 Iceberg 表。Amazon EMR 用户无需显式设置执行引擎,因为 Amazon EMR Hive 会在运行时为 Iceberg 表选择引擎。

    • 单表插入 - 例如:

      INSERT INTO table_name VALUES ('a', 1); INSERT INTO table_name SELECT...;
    • Multi-table in sert into — 支持 Non-atomic 多表插入语句。示例:

      FROM source INSERT INTO table_1 SELECT a, b INSERT INTO table_2 SELECT c,d;

从亚马逊 EMR 7.3.0 开始,Hive with Iceberg 支持 Glue 数据目录AWS作为元存储库。要使用 AWS Glue 数据目录作为元数据库,请设置以下属性。

SET iceberg.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog;

或者,您也可以设置以下属性。

SET iceberg.catalog.<catalog_name>.type=glue;

您可以使用以下示例创建表。

CREATE EXTERNAL TABLE table_name (col1 type1, col2 type2,..) ROW FORMAT SERDE 'org.apache.iceberg.mr.hive.HiveIcebergSerDe' STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' location '<location>' TBLPROPERTIES ('table_type'='iceberg', 'iceberg.catalog'='<catalog_name>');

将 Iceberg 与 Hive 结合使用的注意事项

  • Iceberg 支持以下查询类型:

    • 创建表

    • 删除表

    • 插入到表中

    • 读取表

  • DML(数据操作语言MapReduce)操作仅支持 MR () 执行引擎,Hive 3.1.3 中已弃用 MR。

  • 对于 7.3.0 之前的亚马逊 EMR,带有 Hive 的 Iceberg 目前不支持 AWS Glue 数据目录。

  • 错误处理不够强大。在配置错误的情况下,插入查询可能会成功完成。但是,无法更新元数据可能会导致数据丢失。

  • Iceberg Glue 集成不适用于 Redshift 托管存储目录。