将 Iceberg 集群与 Hive 结合使用 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将 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 集群

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

要在 Amazon EMR 上将 Iceberg 与结合 Amazon CLI使用,请首先使用以下步骤创建一个集群。有关使用 Amazon CLI 或 Java SDK 指定 Iceberg 分类的信息,请参阅在创建集群 Amazon 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 相关配置。

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

注意

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

功能支持

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

  • 在 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 目录。

  • 创建表

    • 非分区表 - 可以通过提供存储处理程序在 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 选择语法的信息,请参阅 Sel LanguageManual ec t。有关在 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...;
    • 多表插入 - 支持在语句中插入非原子多表。示例:

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

从 Amazon EMR 7.3.0 开始,Hive with Iceberg 支持将 Amazon Glue Data Catalog 用作元存储。要将 Amazon Glue Data Catalog 用作元存储,请设置以下属性。

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 () 执行引擎,而 MR 在 Hive 3.1.3 中已弃用。

  • Amazon 带有 Hive 的 Iceberg 目前不支持 Glue Data Catalog。

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

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