更新时间:2022-12-14 GMT+08:00

Hive支持读取Hudi表

Hudi表对应的Hive外部表介绍

Hudi源表对应一份HDFS的数据,通过Spark组件、Flink组件或者Hudi客户端,可以将Hudi表的数据映射为Hive外部表,基于该外部表,Hive可以方便地进行实时视图查询、读优化视图查询以及增量视图查询。

  • 根据Hudi源表的类型的不同,提供不同的视图查询:
    • Hudi源表类型为Copy On Write时,可以映射为Hive的一张外部表,该表可以提供实时视图查询以及增量视图查询。
    • Hudi源表类型为Merge On Read时,可以映射为Hive的两张外部表(ro表和rt表),ro表提供读优化视图查询,rt表提供实时视图查询以及增量视图查询。
  • 不能对Hudi表映射的Hive外部表做增删改操作(即insert、update、delete、load、merge、alter、msck),只支持查询操作(select)。
  • 表授权:不支持修改类权限(update、Alter、write、All)。
  • 备份与恢复:由于ro表和rt表均由同一个hudi源表映射的,备份其中一张表,另一张也会跟着备份,恢复也是同时恢复的,因此只需备份其中一张表即可。
  • Hudi bootstrap表:由于bootstrap表的存储方式与普通Hudi表不一样,因此,对于Tez查询引擎,还需要额外配置“hive.user.aux.jars.path”。登录FusionInsight Manager页面,选择“集群 > 服务 > Hive > 配置 > 全部配置”,在参数“hive.user.aux.jars.path”的值中添加以下路径(使用“,”作为分隔符):
    • ${BIGDATA_HOME}/FusionInsight_HD_8.1.2.2/install/FusionInsight-Hive-3.1.0/hive-3.1.0/lib/hbase-shaded-miscellaneous-xxx.jar
    • ${BIGDATA_HOME}/FusionInsight_HD_8.1.2.2/install/FusionInsight-Hive-3.1.0/hive-3.1.0/lib/hbase-metrics-api-xxx.jar
    • ${BIGDATA_HOME}/FusionInsight_HD_8.1.2.2/install/FusionInsight-Hive-3.1.0/hive-3.1.0/lib/hbase-metrics-xxx.jar
    • ${BIGDATA_HOME}/FusionInsight_HD_8.1.2.2/install/FusionInsight-Hive-3.1.0/hive-3.1.0/lib/hbase-protocol-shaded-xxx.jar
    • ${BIGDATA_HOME}/FusionInsight_HD_8.1.2.2/install/FusionInsight-Hive-3.1.0/hive-3.1.0/lib/hbase-shaded-protobuf-xxx.jar
    • ${BIGDATA_HOME}/FusionInsight_HD_8.1.2.2/install/FusionInsight-Hive-3.1.0/hive-3.1.0/lib/htrace-core4-4.2.0-incubating-xxx.jar

    以上的xxx以Hiveserver节点路径下的实际版本为准,比如hbase-shaded-miscellaneous-xxx.jar在实际环境的名字为:hbase-shaded-miscellaneous-3.3.0.jar,则需要用3.3.0替换xxx,其他同理。

  • 组件版本:
    • Hive:FusionInsight_HD_8.1.2.2,Hive内核版本3.1.0。
    • Spark2x:FusionInsight_Spark2x_8.1.2.2,Hudi内核版本:0.9.0。

创建Hudi表对应的Hive外部表

Hudi表数据在入湖的时候一般会同步到Hive外部表,此时在Beeline中可以直接查询到对应的Hive外部表,若没有同步到Hive外部表,则可以通过Hudi客户端工具run_hive_sync_tool.sh手动同步。

查询Hudi表对应的Hive外部表

操作前提

使用Hive查询Hudi表前,需要设置hive.input.format。

另外对于增量查询,还需要额外设置3个参数,这3个参数是表级别的参数,每个hudi源表都对应3个参数,其中hudisourcetablename代表Hudi源表的表名(注意不是Hive外部表的表名)。

表1 参数说明

参数名

默认值

描述

hoodie. hudisourcetablename.consume.mode

Hudi表的查询模式。

  • 增量查询:INCREMENTAL
  • 非增量查询:不设置或者设为SNAPSHOT

hoodie. hudisourcetablename.consume.start.timestamp

Hudi表增量查询的起始时间。

  • 增量查询:增量查询的起始时间
  • 非增量查询:不设置

hoodie. hudisourcetablename.consume.max.commits

Hudi表增量查询基于hoodie. hudisourcetablename.consume.start.timestamp之后commit的次数。

  • 增量查询:提交次数,如设置为3时,代表增量查询从指定的起始时间之后commit 3次的数据,设为-1时,增量查询从指定的起始时间之后提交的所有数据。
  • 非增量查询:不设置

Copy On Write类型Hudi表查询

例如:cow类型Hudi源表的表名为hudicow,映射为Hive外部表的表名为hudicow。

  • cow表实时视图查询:设置了hive.input.format之后,像普通Hive表一样查询即可:

    set hive.input.format= org.apache.hadoop.hive.ql.io.HiveInputFormat;

    Select * from hudicow;

  • cow表增量查询:除了需要设置hive.input.format,还需要根据Hudi源表的表名设置3个增量查询参数,且增量查询语句的where子句必须包含“`_hoodie_commit_time`>'xxx'”,其中的xxx为“hoodie.hudisourcetablename.consume.start.timestamp”增量参数的值:

    set hive.input.format= org.apache.hadoop.hive.ql.io.HiveInputFormat;

    set hoodie.hudicow.consume.mode= INCREMENTAL;

    set hoodie.hudicow.consume.max.commits=3;

    set hoodie.hudicow.consume.start.timestamp= 20200427114546;

    select count(*) from hudicow where `_hoodie_commit_time`>'20200427114546';

Merge On Read类型Hudi表的查询

例如:mor类型Hudi源表的表名为hudimor,映射为两张Hive外部表hudimor_ro(ro表)和hudimor_rt(rt表)。

  • ro表提供读读优化视图查询:设置了hive.input.format之后,像普通Hive表一样查询即可:

    set hive.input.format= org.apache.hadoop.hive.ql.io.HiveInputFormat;

    Select * from hudicow_ro;

  • rt的实时视图查询:设置了hive.input.format之后,即可查询到Hudi源表的最新数据:

    set hive.input.format= org.apache.hadoop.hive.ql.io.HiveInputFormat;

    Select * from hudicow_rt;

  • rt表的增量查询:除了需要设置hive.input.format,还需要根据Hudi源表的表名设置3个增量查询参数,且增量查询语句的where子句必须包含“`_hoodie_commit_time`>'xxx'”,其中的xxx为“hoodie.hudisourcetablename.consume.start.timestamp”增量参数的值:

    set hive.input.format=org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat;

    set hoodie.hudimor.consume.mode=INCREMENTAL;

    set hoodie.hudimor.consume.max.commits=-1;

    set hoodie.hudimor.consume.start.timestamp=20210207144611;

    select * from hudimor_rt where `_hoodie_commit_time`>'20210207144611';

    • set hive.input.format=org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat;仅用于rt表的增量查询,其它表不能使用该参数,因此在rt表增量查询完成后,应该设置set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;或者改为默认值set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;用于其他表的查询。
    • set hoodie.hudisourcetablename.consume.mode=INCREMENTAL;仅用于该表的增量查询模式,若要对该表切换为其他查询模式,应设置set hoodie.hudisourcetablename.consume.mode=SNAPSHOT;