本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 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 集成
创建 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 Amazon 数据目录。默认 Iceberg 目录为 HiveCatalog
,它对应于为 Hive 环境配置的元存储。有关目录管理的更多信息,请参阅 Apache Hiv
功能支持
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 包含在 Hiveauxlib
目录中。使用以下命令将其包含在内:sudo /usr/bin/ln -sf /usr/lib/hive/lib/libfb303-*.jar /usr/lib/hive/auxlib/libfb303.jar
在 Amazon EMR 6.13 及更高版本中,
libfb303
jar 会自动符号链接到 Hiveauxlib
目录。 -
创建表
-
非分区表 - 可以通过提供存储处理程序在 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...;
-
多表插入 - 支持在语句中插入非原子多表。示例:
FROM source INSERT INTO table_1 SELECT a, b INSERT INTO table_2 SELECT c,d;
-
从亚马逊 EMR 7.3.0 开始,Hive with Iceberg 支持 Glue 数据目录 Amazon 作为元存储库。要使用 Amazon 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。
-
Amazon 带有 Hive 的 Iceberg 目前不支持 Glue 数据目录。
-
错误处理不够强大。在配置错误的情况下,插入查询可能会成功完成。但是,无法更新元数据可能会导致数据丢失。
Iceberg Glue 集成不适用于 Redshift 托管存储目录。