探索Iceberg与Hive的深度集成之旅
Hive与Iceberg集成指南
环境准备
1. Hive与Iceberg的版本对应关系
| Hive 版本 | 官方推荐Hive版本 | Iceberg 版本 |
|---|---|---|
| 2.x | 2.3.8 | 0.8.0-incubating – 1.1.0 |
| 3.x | 3.1.2 | 0.10.0 – 1.1.0 |
Iceberg与Hive 2和Hive 3.1.2/3的集成,支持以下特性:
- 创建表
- 删除表
- 读取表
- 插入表(INSERT into)
更多功能需要Hive 4.x(目前alpha版本)才能支持。
2. 上传jar包,拷贝到Hive的auxlib目录中
bash
mkdir auxlib
cp iceberg-hive-runtime-1.1.0.jar /opt/module/hive/auxlib
cp libfb303-0.9.3.jar /opt/module/hive/auxlib
将以上jar包下载后,上传到Hive服务端和客户端对应的lib目录下。
3. 修改hive-site.xml,添加配置项
xml
<property>
<name>iceberg.engine.hive.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.aux.jars.path</name>
<value>/opt/module/hive/auxlib</value>
</property>
4. 使用TEZ引擎注意事项(可选)
- 使用Hive版本>=3.1.2,需要TEZ版本>=0.10.1
- 指定tez更新配置:
xml
<property>
<name>tez.mrreader.config.update.properties</name>
<value>hive.io.file.readcolumn.names,hive.io.file.readcolumn.ids</value>
</property>
- 从Iceberg 0.11.0开始,如果Hive使用Tez引擎,需要关闭向量化执行:
xml
<property>
<name>hive.vectorized.execution.enabled</name>
<value>false</value>
</property>
5. 启动HMS服务
6. 启动Hadoop
创建管理Catalog
Iceberg支持多种不同的Catalog类型,例如:Hive、Hadoop、亚马逊的AWS Glue和自定义Catalog。根据不同配置,分为三种情况:
- 没有设置
iceberg.catalog,默认使用HiveCatalog - 设置了
iceberg.catalog的类型,使用指定的Catalog类型 - 设置
iceberg.catalog=location_based_table,直接通过指定的根路径来加载Iceberg表
| 配置项 | 说明 |
|---|---|
iceberg.catalog.<catalog_name>.type |
Catalog的类型: hive, hadoop, 如果使用自定义Catalog,则不设置 |
iceberg.catalog.<catalog_name>.catalog-impl |
Catalog的实现类, 如果上面的type没有设置,则此参数必须设置 |
iceberg.catalog.<catalog_name>. |
Catalog的其他配置项 |
2.1 默认使用 HiveCatalog
sql
CREATE TABLE iceberg_test1 (i int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
INSERT INTO iceberg_test1 VALUES(1);
DESCRIBE iceberg_test1;
DESCRIBE FORMATTED iceberg_test1;
创建的表目录在默认的hive仓库路径下。

2.2 指定 Catalog 类型
1)使用 HiveCatalog
sql
SET iceberg.catalog.iceberg_hive.type=hive;
SET iceberg.catalog.iceberg_hive.uri=thrift://192.168.110.120:9083;
SET iceberg.catalog.iceberg_hive.clients=10;
CREATE TABLE iceberg_test2 (i int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
TBLPROPERTIES('iceberg.catalog'='iceberg_hive');
INSERT INTO iceberg_test2 VALUES(1);
2)使用 HadoopCatalog
sql
SET iceberg.catalog.iceberg_hadoop.type=hadoop;
SET iceberg.catalog.iceberg_hadoop.warehouse=hdfs://192.168.110.120:8020/warehouse/iceberg-hadoop;
CREATE TABLE iceberg_test3 (i int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
LOCATION 'hdfs://192.168.110.120:8020/warehouse/iceberg-hadoop/default/iceberg_test3'
TBLPROPERTIES('iceberg.catalog'='iceberg_hadoop');
INSERT INTO iceberg_test3 VALUES(1);
HiveCatalog和HadoopCatalog的区别 区别在于元数据文件的名称,可以在HDFS中查看metadata进行区分。


2.2.3 指定路径加载
如果HDFS中已经存在Iceberg格式表,我们可以通过在Hive中创建Iceberg格式表指定对应的location路径映射数据。
sql
CREATE EXTERNAL TABLE iceberg_test4 (i int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
LOCATION 'hdfs://192.168.110.120:8020/warehouse/iceberg-hadoop/default/iceberg_test3'
TBLPROPERTIES ('iceberg.catalog'='location_based_table');
注意: 表iceberg_test4需要跟原表数据类型保持一致。
location: location要指定到具体的表名。
如果指定路径加载时创建的是内部表,删除iceberg_test4表的同时,会删除iceberg_test3表的数据(show tables;可以查到表,但是查表数据会报错:Table does not exist)。所以指定路径加载 建议创建外部表。
DDL操作
3.1 创建表
1)创建外部表
sql
CREATE EXTERNAL TABLE iceberg_create1 (i int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
DESCRIBE FORMATTED iceberg_create1;
2)创建内部表
sql
CREATE TABLE iceberg_create2 (i int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
DESCRIBE FORMATTED iceberg_create2;
3)创建分区表
sql
CREATE EXTERNAL TABLE iceberg_create3 (id int, name string)
PARTITIONED BY (age int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
DESCRIBE FORMATTED iceberg_create3;
Hive语法创建分区表,不会在HMS中创建分区(这个指的是hive分隔的分区),而是将分区数据转换为Iceberg标识分区。这种情况下不能使用Iceberg的分区转换,例如:days(timestamp),如果想要使用Iceberg格式表的分区转换标识分区,需要使用Spark或者Flink引擎创建表。
3.2 修改表
只支持HiveCatalog表修改表属性(字段调整,分区变化都不支持修改。Hive 4支持字段调整等),Iceberg表属性和Hive表属性存储在HMS中是同步的。
sql
ALTER TABLE iceberg_create1 SET TBLPROPERTIES('external.table.purge'='FALSE');
3.3 插入表
支持标准单表INSERT INTO操作。
sql
INSERT INTO iceberg_create2 VALUES (1);
INSERT INTO iceberg_create1 SELECT * FROM iceberg_create2;
在HIVE 3.x中,INSERT OVERWRITE虽然能执行,但其实是追加。
3.4 删除表
sql
DROP TABLE iceberg_create1;
3.5 Hive操作Iceberg元数据
下表列举了Hive不同版本支持的SQL功能,最新Hive版本基于3.1.2。

从Hive引擎视角来看,它只有一个全局的运行时Catalog概念,而Iceberg可以支持不同的Catalog类型,Hive、Hadoop、第三方厂商的Catalog如AWS Glue和自定义Catalog。在实际应用场景中,Hive可能使用上述任意Catalog,甚至跨不同Catalog类型join数据,为此Hive提供了org.apache.iceberg.mr.hive.HiveIcebergStorageHandler(位于包iceberg-hive-runtime.jar)来支持读写Iceberg表,并通过iceberg.catalog属性来决定加载Iceberg表的方式。

上图说明了如何注册不同类型的Catalog,下面根据不同的使用方式举例说明。
1. 如果iceberg.catalog属性没有设置,默认使用HiveCatalog来加载
sql
SET iceberg.catalog.another_hive.type=hive;
SET iceberg.catalog.another_hive.uri=thrift://localhost:55452;
SET iceberg.catalog.another_hive.clients=10;
SET iceberg.catalog.another_hive.warehouse=/Users/deepexi/workplace/hive-learn/warehouse;
CREATE TABLE test_db.test_tbl1 (
id bigint,
name string
)
PARTITIONED BY (
dept string
)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
2. 如果iceberg.catalog属性设置了catalog名字,就用对应类型的catalog加载
sql
SET iceberg.catalog.hadoop_cat.type=hadoop;
SET iceberg.catalog.hadoop_cat.warehouse=/Users/deepexi/workplace/hive-learn/hadoop_cat;
CREATE TABLE test_db.test_tbl2 (
id bigint,
name string
)
PARTITIONED BY (
dept string
)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
TBLPROPERTIES ('iceberg.catalog'='hadoop_cat');
3. 如果iceberg.catalog属性设置为location_based_table,就用HadoopCatalog从指定的location加载
sql
CREATE TABLE test_db.test_tbl3 (
id bigint,
name string
)
PARTITIONED BY (
dept string
)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
LOCATION '/Users/deepexi/workplace/hive-learn/warehouse/test_db/test_tbl3'
TBLPROPERTIES ('iceberg.catalog'='location_based_table');
大数据相关学习资料
大数据相关学习资料、大数据项目、湖仓一体、架构师必知必会、数据中台建设方法论...共有1400多份文档资料,另专为星球成员整理了一份比较详细的语雀知识库合计190万字和飞书文档资料。(内容太多,仅展示部分内容...),欢迎大家踊跃加入星球,您将获得:
- 提供最全的大数据知识库,不限设备,随时随地打开看的在线文档。
- 免费答疑解惑、交流技术
- 面试指导、模拟面试
- 各类pdf文档下载、星球代码下载
- 提供简历模板,简历修改指导服务,星球成员免费提供简历修改指导。
另外说明加入星球后支持三天无理由退款,不满意无条件随时退。需要资料请加微信:D1435221412

end
