改版通知

巨人肩膀网站已全新改版。若您仍依赖旧站功能或数据,欢迎联系我们,我们会协助处理。联系我们

探索Iceberg与Hive的深度集成之旅

ckckck2025年1月10日41 浏览

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引擎注意事项(可选)

  1. 使用Hive版本>=3.1.2,需要TEZ版本>=0.10.1
  2. 指定tez更新配置:
xml 复制代码
<property>
    <name>tez.mrreader.config.update.properties</name>
    <value>hive.io.file.readcolumn.names,hive.io.file.readcolumn.ids</value>
</property>
  1. 从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进行区分。

HiveCatalog
HadoopCatalog

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支持功能

从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注册

上图说明了如何注册不同类型的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万字和飞书文档资料。(内容太多,仅展示部分内容...),欢迎大家踊跃加入星球,您将获得:

  1. 提供最全的大数据知识库,不限设备,随时随地打开看的在线文档。
  2. 免费答疑解惑、交流技术
  3. 面试指导、模拟面试
  4. 各类pdf文档下载、星球代码下载
  5. 提供简历模板,简历修改指导服务,星球成员免费提供简历修改指导。

另外说明加入星球后支持三天无理由退款,不满意无条件随时退。需要资料请加微信:D1435221412

资料

end