乘风原创程序

  • Apache教程Hudi与Hive集成手册
  • 2022/3/31 13:57:56
  • 1. hudi表对应的hive外部表介绍

    hudi源表对应一份hdfs数据,可以通过spark,flink 组件或者hudi客户端将hudi表的数据映射为hive外部表,基于该外部表, hive可以方便的进行实时视图,读优化视图以及增量视图的查询。

    2. hive对hudi的集成

    这里以hive3.1.1、 hudi 0.9.0为例, 其他版本类似

    将hudi-hadoop-mr-bundle-0.9.0xxx.jar , hudi-hive-sync-bundle-0.9.0xx.jar 放到hiveserver 节点的lib目录下

    修改hive-site.xml找到hive.default.aux.jars.path 以及hive.aux.jars.path 这两个配置项,将第一步中的jar包全路径给配置上去: 配置后如下

    <name>hive.default.aux.jars.path</name>
    <value>xxxx,jar,xxxx,jar,file:///mypath/hudi-hadoop-mr-bundle-0.9.0xxx.jar,file:///mypath/hudi-hive-sync-bundle-0.9.0xx.jar</value>
    

    配置完后重启hive-server

    对于hudi的bootstrap表(tez查询),除了要添加hudi-hadoop-mr-bundle-0.9.0xxx.jar , hudi-hive-sync-bundle-0.9.0xx.jar这两个jar包,还需把hbase-shaded-miscellaneous-xxx.jar, hbase-metric-api-xxx.jar,hbase-metrics-xxx.jar, hbase-protocol-shaded-xx.jar,hbase-shaded-protobuf-xxx.jar,htrce-core4-4.2.0xxxx.jar按上述步骤添加进去。

    3. 创建hudi表对应的hive外部表

    一般来说hudi表在用spark或者flink写入数据时会自动同步到hive外部表, 此时可以直接通过beeline查询同步的外部表, 若写入引擎没有开启自动同步,则需要手动利用hudi客户端工具run_hive_sync_tool.sh 进行同步具体可以参考官网查看相关参数。

    4. 查询hudi表对应的hive外部表

    4.1 操作前提

    使用hive查询hudi表前,需要通过set命令设置hive.input.format,否则会出现数据重复,查询异常等错误,如下面这个报错就是典型的没有设置hive.input.format 导致的

    java.lang.illegalargumentexception: hoodierealtimereader can oly work on realtimesplit and not with xxxxxxxxxx

    除此之外对于增量查询,还需要set命令额外设置3个参数

    set hoodie.mytablename.consume.mode=incremental;
    set hoodie.mytablename.consume.max.commits=3;
    set hoodie.mytablename.consume.start.timestamp=committime;
    

    注意这3个参数是表级别参数

    参数名描述
    hoodie.mytablename.consume.modehudi表的查询模式。 增量查询 :incremental非增量查询:不设置或者设为snapshot
    hoodie.mytablename.consume.start.timestamphudi表增量查询起始时间
    hoodie. mytablename.consume.max.commitshudi表基于hoodie.mytablename.consume.start.timestamp 之后要查询的增量commit次数。提交次数,如设置为3时,代表增量查询从指定的起始时间之后commit 3次的数据,设为-1时,增量查询从指定的起始时间之后提交的所有数据

    4.2 cow类型hudi表的查询

    例如hudi原表表名为hudicow,同步给hive之后hive表名hudicow

    4.2.1 cow表实时视图查询

    设置hive.input.format 为org.apache.hadoop.hive.ql.io.hiveinputformat或者org.apache.hudi.hadoop.hive.hoodiecombinehiveinputformat后,像普通的hive表一样查询即可

    set hive.input.format= org.apache.hadoop.hive.ql.io.hiveinputformat;
    select count(*) from hudicow;
    

    4.2.2 cow表增量查询

    除了要设置hive.input.format,还需要设置上述的3个增量查询参数,且增量查询语句中的必须添加where 关键字并将_hoodie_commit_time > 'startcommittime'作为过滤条件(这地方主要是hudi的小文件合并会把新旧commit的数据合并成新数据,hive是没法直接从parquet文件知道哪些是新数据哪些是老数据)

    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 = xxxx;
    select count(*) from hudicow where `_hoodie_commit_time` > 'xxxx'
    

    注意_hoodie_commit_time 的引号是反引号(tab键上面那个)不是单引号, 'xxxx'是单引号

    4.3 mor类型hudi表的查询

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

    4.3.1 mor表读优化视图

    实际上就是读 ro表,和cow表类似设置完hiveinputformat 之后 和普通的hive表一样查询即可。

    4.3.2 mor表实时视图

    设置了hive.input.format之后,即可查询到hudi源表的最新数据

    set hive.input.format = org.apache.hadoop.hive.ql.io.hiveinputformat;
    select * from hudicow_rt;
    

    4.3.3 mor表增量查询

    这个增量查询针对的rt表,不是ro表。通cow表的增量查询类似

    set hive.input.format = org.apache.hudi.hadoop.hive.hoodiecombinehiveinputformat; // 这地方指定为hoodiecombinehiveinputformat
    set hoodie.hudimor.consume.mode = incremental;set hoodie.hudimor.consume.max.commits = -1;
    set hoodie.hudimor.consume.start.timestamp = xxxx;
    select * from hudimor_rt where `_hoodie_commit_time` > 'xxxx'; // 这个表名要是rt表
    

    说明如下

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

    最好只用于rt表的增量查询,当然其他种类的查询也可以设置为这个,这个参数会影响到普通的hive表查询,因此在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.mytablename.consume.mode=incremental;

    仅用于该表的增量查询模式,若要对该表切换为其他查询模式,应设置

    set hoodie.hudisourcetablename.consume.mode=snapshot;

    当前hudi(0.9.0)对接hive的一些问题,请使用master分支或即将发布的0.10.0版本

    hive读hudi表会将所有的数据给打印出来有严重的性能问题和数据安全问题。

    mor表的实时视图读取 请按需设置mapreduce.input.fileinputformat.split.maxsize的大小 禁止hive取切分读取的文件,否则会出现数据重复。这个问题当前是无解的,spark读hudi实时视图的时候代码直接写死不会切分文件,hive需要手动设置。

    如果碰到classnotfound, nosuchmethod等错误请检查hive lib库下面的jar包是否出现冲突。

    5. hive侧源码修改

    为支持hive查询hudi的纯log文件需要对hive侧源码进行修改。

    具体修改org.apache.hadoop.hive.common.fileutils 如下函数

    public static final pathfilter hidden_files_path_filter = new pathfilter() {? ? 
      @override? ? 
      public boolean accept(path p) {? ? ? 
        string name = p.getname();? ? ? 
        boolean ishudimeta = name.startswith(".hoodie");? ? ? 
        boolean ishudilog = false;? ? ? 
        pattern log_file_pattern = pattern.compile("\\.(.*)_(.*)\\.(.*)\\.([0-9]*)(_(([0-9]*)-([0-9]*)-([0-9]*)))?");? ? ? 
        matcher matcher = log_file_pattern.matcher(name);? ? ? 
        if (matcher.find()) {? ? ? ? 
          ishudilog = true;? ? ? 
        }? ? ? 
        boolean ishudifile = ishudilog || ishudimeta;? ? ? 
        return (!name.startswith("_") && !name.startswith(".")) || ishudifile;? ? 
      }? 
    };
    

    重新编译hive, 把新编译的hive-common-xxx.jarhive-exec-xxx.jar 替换到hive server的lib目录下注意权限和名字和原来的jar包保持一致。

    最后重启hive-server即可。

    以上就是apache教程hudi与hive集成手册 的详细内容,更多关于apache hudi与hive集成手册 的资料请关注本教程网其它相关文章!