• 数据湖(十):Hive与Iceberg整合


    文章目录

    Hive与Iceberg整合

    一、开启Hive支持Iceberg

    1、下载iceberg-hive-runtime.jar

    2、配置hive-site.xml

    二、​​​​​​​​​​​​​​Hive中操作Iceberg格式表

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

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

    3、如果iceberg.catalog属性设置为“location_based_table”,可以从指定的根路径下加载Iceberg表


    Hive与Iceberg整合

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

    操作

    Hive 2.x

    Hive 3.1.2

    CREATE EXTERNAL TABLE

    CREATE TABLE

    DROP TABLE

    SELECT

    INSERT INTO

    这里基于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中添加如下配置:

    1. <property>
    2. <name>iceberg.engine.hive.enabled</name>
    3. <value>true</value>
    4. </property>

    二、​​​​​​​​​​​​​​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格式表如何加载(数据存储在什么位置)。

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

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

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

    1. #在Hive中创建iceberg格式表
    2. create table test_iceberg_tbl1(
    3. id int ,
    4. name string,
    5. age int)
    6. partitioned by (dt string)
    7. stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
    8. #在Hive中加载如下两个包,在向Hive中插入数据时执行MR程序时需要使用到
    9. hive> add jar /software/hive-3.1.2/lib/iceberg-hive-runtime-0.12.1.jar;
    10. hive> add jar /software/hive-3.1.2/lib/libfb303-0.9.3.jar;
    11. #向表中插入数据
    12. hive> insert into test_iceberg_tbl1 values (1,"zs",18,"20211212");
    13. #查询表中的数据
    14. hive> select * from test_iceberg_tbl1;
    15. OK
    16. 1 zs 18 20211212

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

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

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

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

    1. #注册一个HiveCatalog叫another_hive
    2. hive> set iceberg.catalog.another_hive.type=hive;
    3. #在Hive中创建iceberg格式表
    4. create table test_iceberg_tbl2(
    5. id int,
    6. name string,
    7. age int
    8. )
    9. partitioned by (dt string)
    10. stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    11. tblproperties ('iceberg.catalog'='another_hive');
    12. #在Hive中加载如下两个包,在向Hive中插入数据时执行MR程序时需要使用到
    13. hive> add jar /software/hive-3.1.2/lib/iceberg-hive-runtime-0.12.1.jar;
    14. hive> add jar /software/hive-3.1.2/lib/libfb303-0.9.3.jar;
    15. #插入数据,并查询
    16. hive> insert into test_iceberg_tbl2 values (2,"ls",20,"20211212");
    17. hive> select * from test_iceberg_tbl2;
    18. OK
    19. 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,操作如下:

    1. #注册一个HadoopCatalog叫hadoop
    2. hive> set iceberg.catalog.hadoop.type=hadoop;
    3. #使用HadoopCatalog时,必须设置“iceberg.catalog.<catalog_name>.warehouse”指定warehouse路径
    4. hive> set iceberg.catalog.hadoop.warehouse=hdfs://mycluster/iceberg_data;
    5. #在Hive中创建iceberg格式表,这里创建成外表
    6. create external table test_iceberg_tbl3(
    7. id int,
    8. name string,
    9. age int
    10. )
    11. partitioned by (dt string)
    12. stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    13. location 'hdfs://mycluster/iceberg_data/default/test_iceberg_tbl3'
    14. tblproperties ('iceberg.catalog'='hadoop');
    15. 注意:以上location指定的路径必须是“iceberg.catalog.hadoop.warehouse”指定路径的子路径,格式必须是${iceberg.catalog.hadoop.warehouse}/${当前建表使用的hive库}/${创建的当前iceberg表名}
    16. #在Hive中加载如下两个包,在向Hive中插入数据时执行MR程序时需要使用到
    17. hive> add jar /software/hive-3.1.2/lib/iceberg-hive-runtime-0.12.1.jar;
    18. hive> add jar /software/hive-3.1.2/lib/libfb303-0.9.3.jar;
    19. #插入数据,并查询
    20. hive> insert into test_iceberg_tbl3 values (3,"ww",20,"20211213");
    21. hive> select * from test_iceberg_tbl3;
    22. OK
    23. 3 ww 20 20211213

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

     

    3、如果iceberg.catalog属性设置为“location_based_table”,可以从指定的根路径下加载Iceberg表

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

    1. CREATE TABLE test_iceberg_tbl4 (
    2. id int,
    3. name string,
    4. age int,
    5. dt string
    6. )STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    7. LOCATION 'hdfs://mycluster/spark/person'
    8. TBLPROPERTIES ('iceberg.catalog'='location_based_table');
    9. 注意:指定的location路径下必须是iceberg格式表数据,并且需要有元数据目录才可以。不能将其他数据映射到Hive iceberg格式表。

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


    • 📢博客主页:https://lansonli.blog.csdn.net
    • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
    • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
    • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
  • 相关阅读:
    Unrecognized option ‘stream_loop‘.(版本不匹配,利用make编译安装)
    位运算解决简单逻辑推理问题
    linux基础1
    JVM面试题-类加载顺序、双亲委派、类初始化顺序(详解)
    如何正确地使用ChatGPT(角色扮演+提示工程)
    多目标杜鹃搜索 (MOCS)优化算法(Matlab代码实现)
    聊聊芯片制造中的金属杂质
    启动spark历史服务失败问题处理
    为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(上)
    点向行列连边的网络流图优化成行列连边的二分图:CF1592F2
  • 原文地址:https://blog.csdn.net/xiaoweite1/article/details/125397968