数据湖(十):Hive 与 Iceberg 整合
Hive 与 Iceberg 整合
Iceberg 就是一种表格式,支持使用 Hive 对 Iceberg 进行读写操作,但是对 Hive 的版本有要求,如下:
这里基于 Hive3.1.2 版本进行 Hive 操作 Iceberg 表讲解。
一、开启 Hive 支持 Iceberg
1、下载 iceberg-hive-runtime.jar
想要使用 Hive 支持查询 Iceberg 表,首先需要下载“iceberg-hive-runtime.jar”,Hive 通过该 Jar 可以加载 Hive 或者更新 Iceberg 表元数据信息。下载地址:https://iceberg.apache.org/#releases/:
将以上 jar 包下载后,上传到 Hive 服务端和客户端对应的 lib 目录下。另外在向 Hive 中 Iceberg 格式表插入数据时需要到“libfb303-0.9.3.jar”包,将此包也上传到 Hive 服务端和客户端对应的 lib 目录下。
2、配置 hive-site.xml
在 Hive 客户端 $HIVE_HOME/conf/hive-site.xml 中添加如下配置:
二、Hive 中操作 Iceberg 格式表
从 Hive 引擎的角度来看,在运行环境中有 Catalog 概念(catalog 主要描述了数据集的位置信息,就是元数据),Hive 与 Iceberg 整合时,Iceberg 支持多种不同的 Catalog 类型,例如:Hive、Hadoop、第三方厂商的 AWS Glue 和自定义 Catalog。在实际应用场景中,Hive 可能使用上述任意 Catalog,甚至跨不同 Catalog 类型 join 数据,为此 Hive 提供了 org.apache.iceberg.mr.hive.HiveIcebergStorageHandler(位于包 iceberg-hive-runtime.jar)来支持读写 Iceberg 表,并通过在 Hive 中设置“iceberg.catalog..type”属性来决定加载 Iceberg 表的方式,该属性可以配置:hive、hadoop,其中“”是自己随便定义的名称,主要是在 hive 中创建 Iceberg 格式表时配置 iceberg.catalog 属性使用。
在 Hive 中创建 Iceberg 格式表时,根据创建 Iceberg 格式表时是否指定 iceberg.catalog 属性值,有以下三种方式决定 Iceberg 格式表如何加载(数据存储在什么位置)。
1、如果没有设置 iceberg.catalog 属性,默认使用 HiveCatalog 来加载
这种方式就是说如果在 Hive 中创建 Iceberg 格式表时,不指定 iceberg.catalog 属性,那么数据存储在对应的 hive warehouse 路径下。
在 Hive 客户端 node3 节点进入 Hive,操作如下:
在 Hive 默认的 warehouse 目录下可以看到创建的表目录:
2、如果设置了 iceberg.catalog 对应的 catalog 名字,就用对应类型的 catalog 加载
这种情况就是说在 Hive 中创建 Iceberg 格式表时,如果指定了 iceberg.catalog 属性值,那么数据存储在指定的 catalog 名称对应配置的目录下。
在 Hive 客户端 node3 节点进入 Hive,操作如下:
以上方式指定“iceberg.catalog.another_hive.type=hive”后,实际上就是使用的 hive 的 catalog,这种方式与第一种方式不设置效果一样,创建后的表存储在 hive 默认的 warehouse 目录下。也可以在建表时指定 location 写上路径,将数据存储在自定义对应路径上。
除了可以将 catalog 类型指定成 hive 之外,还可以指定成 hadoop,在 Hive 中创建对应的 iceberg 格式表时需要指定 location 来指定 iceberg 数据存储的具体位置,这个位置是具有一定格式规范的自定义路径。在 Hive 客户端 node3 节点进入 Hive,操作如下:
在指定的“iceberg.catalog.hadoop.warehouse”路径下可以看到创建的表目录:
3、如果 iceberg.catalog 属性设置为“location_based_table”,可以从指定的根路径下加载 Iceberg 表
这种情况就是说如果 HDFS 中已经存在 iceberg 格式表,我们可以通过在 Hive 中创建 Icerberg 格式表指定对应的 location 路径映射数据。,在 Hive 客户端中操作如下:
注意:由于 Hive 建表语句分区语法“Partitioned by”的限制,如果使用 Hive 创建 Iceberg 格式表,目前只能按照 Hive 语法来写,底层转换成 Iceberg 标识分区,这种情况下不能使用 Iceberge 的分区转换,例如:days(timestamp),如果想要使用 Iceberg 格式表的分区转换标识分区,需要使用 Spark 或者 Flink 引擎创建表。
版权声明: 本文为 InfoQ 作者【Lansonli】的原创文章。
原文链接:【http://xie.infoq.cn/article/631a1a89b651786116d067b70】。文章转载请联系作者。
评论