数据湖技术之iceberg(五)Hive与Iceberg整合

南墨2年前技术文章1914

1.  版本支持约束条件

Iceberg就是一种表格式,支持使用Hive对Iceberg进行读写操作,但是对Hive的版本有要求,如下:

Iceberg 与 Hive 2.x 和 Hive 3.1.2/3 的兼容性支持以下功能:(仅支持在MR引擎下操作)

  • 创建表

  • 删除表

  • 读表

  • 插入表 (INSERT INTO)

对于 Hive 版本 4.0.0-alpha-1 及更高版本,使用 HiveCatalog 时的 Iceberg 集成支持以下附加功能:(仅支持在TEZ引擎下操作)

  • 创建 Iceberg 身份分区表

  • 创建具有任何分区规范的 Iceberg 表,包括 Iceberg 支持的各种转换

  • 从现有表(CTAS 表)创建表

  • 在保持 Iceberg 和 Hive 模式同步的同时更改表

  • 改变分区模式(更新列)

  • 通过指定分区转换来更改分区模式

  • 截断表

  • 将 Avro、Parquet 或 ORC(非 ACID)格式的表迁移到 Iceberg

  • 读取表的架构

  • 查询 Iceberg 元数据表

  • 时间旅行应用

  • 插入表 (INSERT INTO)

  • 插入数据覆盖现有数据(INSERT OVERWRITE)

2.  集成整合操作

这里基于Hive3.1.2版本进行Hive操作Iceberg表讲解。

1) 开启Hive支持Iceberg

下载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目录下。

配置hive-site.xml

在Hive客户端$HIVE_HOME/conf/hive-site.xml中添加如下配置:

<property>

    <name>iceberg.engine.hive.enabled</name>

    <value>true</value>

</property>

2)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.<catalog_name>.type”属性来决定加载Iceberg表的方式,该属性可以配置:hive、hadoop,其中“<catalog_name>”是自己随便定义的名称,主要是在hive中创建Iceberg格式表时配置iceberg.catalog属性使用。

在Hive中创建Iceberg格式表时,根据创建Iceberg格式表时是否指定iceberg.catalog属性值,有以下三种方式决定Iceberg格式表如何加载(数据存储在什么位置)。

如果没有设置iceberg.catalog属性,默认使用HiveCatalog来加载

这种方式就是说如果在Hive中创建Iceberg格式表时,不指定iceberg.catalog属性,那么数据存储在对应的hive warehouse路径下。

在Hive客户端节点进入Hive,操作如下:

#在Hive中创建iceberg格式表

create table test_iceberg_tbl1(

id int ,

name string,

age int)

partitioned by (dt string)

stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

 

#在Hive中加载如下两个包,在向Hive中插入数据时执行MR程序时需要使用到

hive> add jar /software/hive-3.1.2/lib/iceberg-hive-runtime-0.12.1.jar;

hive> add jar /software/hive-3.1.2/lib/libfb303-0.9.3.jar;

 

#向表中插入数据

hive> insert into test_iceberg_tbl1 values (1,"zs",18,"20211212");

 

#查询表中的数据

hive> select * from test_iceberg_tbl1;

OK

1   zs  18  20211212

在Hive默认的warehouse目录下可以看到创建的表目录:

如果设置了iceberg.catalog对应的catalog名字,就用对应类型的catalog加载

这种情况就是说在Hive中创建Iceberg格式表时,如果指定了iceberg.catalog属性值,那么数据存储在指定的catalog名称对应配置的目录下。

在Hive客户端节点进入Hive,操作如下:

#注册一个HiveCatalog叫another_hive

hive> set iceberg.catalog.another_hive.type=hive;

 

#在Hive中创建iceberg格式表

create table test_iceberg_tbl2(

id int,

name string,

age int

)

partitioned by (dt string)

stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'

tblproperties ('iceberg.catalog'='another_hive');

 

#在Hive中加载如下两个包,在向Hive中插入数据时执行MR程序时需要使用到

hive> add jar /software/hive-3.1.2/lib/iceberg-hive-runtime-0.12.1.jar;

hive> add jar /software/hive-3.1.2/lib/libfb303-0.9.3.jar;

 

#插入数据,并查询

hive> insert into test_iceberg_tbl2 values (2,"ls",20,"20211212");

hive> select * from test_iceberg_tbl2;

OK

2   ls  20  20211212

以上方式指定“iceberg.catalog.another_hive.type=hive”后,实际上就是使用的hive的catalog,这种方式与第一种方式不设置效果一样,创建后的表存储在hive默认的warehouse目录下。也可以在建表时指定location 写上路径,将数据存储在自定义对应路径上。

除了可以将catalog类型指定成hive之外,还可以指定成hadoop,在Hive中创建对应的iceberg格式表时需要指定location来指定iceberg数据存储的具体位置,这个位置是具有一定格式规范的自定义路径。在Hive客户端node3节点进入Hive,操作如下:

#注册一个HadoopCatalog叫hadoop

hive> set iceberg.catalog.hadoop.type=hadoop;

 

#使用HadoopCatalog时,必须设置“iceberg.catalog.<catalog_name>.warehouse”指定warehouse路径

hive> set iceberg.catalog.hadoop.warehouse=hdfs://mycluster/iceberg_data;

 

#在Hive中创建iceberg格式表,这里创建成外表

create external table test_iceberg_tbl3(

id int,

name string,

age int

)

partitioned by (dt string)

stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'

location 'hdfs://mycluster/iceberg_data/default/test_iceberg_tbl3'

tblproperties ('iceberg.catalog'='hadoop');

 

注意:以上location指定的路径必须是“iceberg.catalog.hadoop.warehouse”指定路径的子路径,格式必须是${iceberg.catalog.hadoop.warehouse}/${当前建表使用的hive库}/${创建的当前iceberg表名}

 

#在Hive中加载如下两个包,在向Hive中插入数据时执行MR程序时需要使用到

hive> add jar /software/hive-3.1.2/lib/iceberg-hive-runtime-0.12.1.jar;

hive> add jar /software/hive-3.1.2/lib/libfb303-0.9.3.jar;

 

#插入数据,并查询

hive> insert into test_iceberg_tbl3 values (3,"ww",20,"20211213");

hive> select * from test_iceberg_tbl3;

OK

3   ww  20  20211213

在指定的“iceberg.catalog.hadoop.warehouse”路径下可以看到创建的表目录:

如果iceberg.catalog属性设置为“location_based_table”,可以从指定的根路径下加载Iceberg表(针对已存在的iceberg表)

这种情况就是说如果HDFS中已经存在iceberg格式表,我们可以通过在Hive中创建Icerberg格式表指定对应的location路径映射数据。,在Hive客户端中操作如下:

CREATE TABLE test_iceberg_tbl4  (

  id int,

  name string,

  age int,

  dt string

)STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'

LOCATION 'hdfs://mycluster/spark/person'

TBLPROPERTIES ('iceberg.catalog'='location_based_table');

 

注意:指定的location路径下必须是iceberg格式表数据,并且需要有元数据目录才可以。不能将其他数据映射到Hive iceberg格式表。

注意:由于Hive建表语句分区语法“Partitioned by”的限制,如果使用Hive创建Iceberg格式表,目前只能按照Hive语法来写,底层转换成Iceberg标识分区,这种情况下不能使用Iceberge的分区转换,例如:days(timestamp),如果想要使用Iceberg格式表的分区转换标识分区,需要使用Spark或者Flink引擎创建表。


相关文章

MySQL 同步方式

同步方式一、分类同步大致为异步、半同步、增强版同步、全同步;二、详情1.异步复制MySQL 默认的复制策略,Master处理事务过程中,将其写入Binlog就会通知Dump thread线程处理,然后...

Python 识别 MySQL 中的冗余索引

前言最近在搞标准化巡检平台,通过 MySQL 的元数据分析一些潜在的问题。冗余索引也是一个非常重要的巡检目,表中索引过多,会导致表空间占用较大,索引的数量与表的写入速度与索引数成线性关系(微秒级),如...

apache Hbase2.x  使用hbck2修复工具

apache Hbase2.x 使用hbck2修复工具

1、背景默认情况下apache hbase 使用hbck2时,无法使用-j 来加载hbck2的jar包,无法进行修复2、解决办法是由于默认情况下只使用自带的hbase hbck修复命令,大部分功能在2...

磁盘分盘脚本分享

磁盘分区脚本名称:mg_fdisk.sh#!/bin/bashif [ "$#" -ne 1 ]; then  echo "请传入磁盘参数"  exit 1fidisk=$1# 检查磁盘是否存在if...

MapReduce生产经验

MapReduce程序效率的瓶颈在于两点:1)计算机性能(1)CPU、内存、磁盘、网络2)I/O操作优化(1)数据倾斜(2)Map运行时间太长,导致Reduce等待过久(3)小文件过多下来就根据这两点...

Apache trino的ldap认证开启

Apache trino的ldap认证开启

1、背景由于trino 默认没有开启用户认证体系,需要ldap用户进行认证。开启tls和ldap用户认证。提高安全性2、配置前置条件。trino 集群已经部署完成ldap 服务openjdk 版本大于...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。