Hudi(六)集成Hive

这篇具有很好参考价值的文章主要介绍了Hudi(六)集成Hive。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1、集成步骤

1、拷贝编译好的jar包

cp /opt/software/hudi-0.12.0/packaging/hudi-hadoop-mr-bundle/target/hudi-hadoop-mr-bundle-0.12.0.jar /opt/module/hive/lib/

cp /opt/software/hudi-0.12.0/packaging/hudi-hive-sync-bundle/target/hudi-hive-sync-bundle-0.12.0.jar /opt/module/hive/lib/

2、配置完后重启hive

// 按照需求选择合适的方式重启
nohup hive --service metastore &
nohup hive --service hiveserver2 &

2、Hive同步

2.1、Flink同步Hive

1、使用方式

        Flink hive sync现在支持两种hive sync mode, 分别是hms和jdbc模式。 其中hms只需要配置metastore uris;而jdbc模式需要同时配置jdbc属性和metastore uris,具体配置模版如下:

## hms mode 配置

CREATE TABLE t1(
  uuid VARCHAR(20),
  name VARCHAR(10),
  age INT,
  ts TIMESTAMP(3),
  `partition` VARCHAR(20)
)	
PARTITIONED BY (`partition`)
with(
  'connector'='hudi',
  'path' = 'hdfs://xxx.xxx.xxx.xxx:9000/t1',
  'table.type'='COPY_ON_WRITE',        -- MERGE_ON_READ方式在没生成parquet文件前,hive不会有输出
  'hive_sync.enable'='true',           -- required,开启hive同步功能
  'hive_sync.table'='${hive_table}',              --required, hive新建的表名
  'hive_sync.db'='${hive_db}',             -- required, hive 新建的数据库名
  'hive_sync.mode' = 'hms',            -- required, 将hive sync mode设置为hms, 默认jdbc
  'hive_sync.metastore.uris' = 'thrift://ip:9083' -- required, metastore的端口
);

3、Flink使用HiveCatalog

        flink使用hivetalog不仅可以看到hudi的元数据,还可以看到hive的元数据,还可以调用hive的函数。

CREATE CATALOG hive_catalog
  WITH (
    'type' = 'hive',
    'default-database' = 'default',
    'hive-conf-dir' = '/opt/module/hive/conf',
    'hadoop-conf-dir'='/opt/module/hadoop/etc/hadoop'
  );

use catalog hive_catalog;


-- hive-connector内置了hive module,提供了hive自带的系统函数
load module hive with ('hive-version'='2.7.6');
show modules;
show functions;

-- 可以调用hive的split函数
select split('a,b', ',');

4、创建Hive外表

        一般来说Hudi表在用Spark或者Flink写入数据时会自动同步到Hive外部表,此时可以直接通过beeline查询同步的外部表,若写入引擎没有开启自动同步,则需要手动利用hudi客户端工具run_hive_sync_tool.sh进行同步,具体后面介绍。

5、查询Hive外表

5.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.mode

Hudi表的查询模式。

增量查询 :INCREMENTAL。

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

hoodie.mytableName.consume.start.timestamp

Hudi表增量查询起始时间。

hoodie. mytableName.consume.max.commits

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

例如:

设置为3时,增量查询从指定的起始时间之后commit 3次的数据

设为-1时,增量查询从指定的起始时间之后提交的所有数据

5.2、 COW表查询 

        这里假设同步的 Hive 外表名为hudi_cow。

5.2.1、实时视图

        设置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 hudi_cow;

5.2.2、增量视图

        除了要设置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'是单引号)

5.3、MOR表查询

        这里假设MOR类型Hudi源表的表名为hudi_mor,映射为两张Hive外部表hudi_mor_ro(ro表)和hudi_mor_rt(rt表)。

5.3.1、实时视图

        针对的是rt表,最新的全量数据。设置了hive.input.format之后,即可查询到Hudi源表的最新数据

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

5.3.2、读优化视图

        针对的是ro表,只会查询到列式数据 。ro表全称read optimized table,对于MOR表同步的xxx_ro表,只暴露压缩后的parquet。其查询方式和COW表类似。设置完hiveInputFormat之后和普通的Hive表一样查询即可。

5.3.3、增量视图

        这个增量查询针对的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;

6、hive sync tool

        若写入引擎没有开启自动同步,则需要手动利用Hudi客户端工具进行同步,Hudi提供Hive sync tool用于同步Hudi最新的元数据(包含自动建表、增加字段、同步分区信息)到hive metastore。
        Hive sync tool提供三种同步模式,JDBC,HMS,HIVESQL。这些模式只是针对Hive执行DDL的三种不同方式。在这些模式中,JDBC或HMS优于HIVESQL, HIVESQL主要用于运行DML而不是DDL。

6.1、使用语法及参数

        脚本位置在hudi源码路径下的hudi-sync/hudi-hive-sync/run_sync_tool.sh。注意jdbc方式的端口是10000,hms方式的端口是9083

6.1.1、语法

#查看语法帮助
./run_sync_tool.sh --help

#语法:
./run_sync_tool.sh  \
--jdbc-url jdbc:hive2:\/\/hiveserver:10000 \
--user hive \
--pass hive \
--partitioned-by partition \
--base-path <basePath> \
--database default \
--table <tableName>

        从Hudi0.5.1版本开始,读时合并优化版本的表默认带有'_ro'后缀。为了向后兼容旧的Hudi版本,提供了一个可选的配置--skip-ro-suffix,如果需要,可以关闭'_ro'后缀。

6.1.2、参数说明

HiveSyncConfig

DataSourceWriteOption

描述

--database

hoodie.datasource.hive_sync.database

同步到hive的目标库名

--table

hoodie.datasource.hive_sync.table

同步到hive的目标表名

--user

hoodie.datasource.hive_sync.username

hive metastore 用户名

--pass

hoodie.datasource.hive_sync.password

hive metastore 密码

--use-jdbc

hoodie.datasource.hive_sync.use_jdbc

使用JDBC连接到hive metastore

--jdbc-url

hoodie.datasource.hive_sync.jdbcurl

Hive metastore url

--sync-mode

hoodie.datasource.hive_sync.mode

同步hive元数据的方式. 有效值为 hms, jdbc hiveql.

--partitioned-by

hoodie.datasource.hive_sync.partition_fields

hive分区字段名,多个字段使用逗号连接.

--partition-value-extractor

hoodie.datasource.hive_sync.partition_extractor_class

解析分区值的类名,默认SlashEncodedDayPartitionValueExtractor文章来源地址https://www.toymoban.com/news/detail-471395.html

到了这里,关于Hudi(六)集成Hive的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hudi(六)集成Hive

            Hudi源表对应一份HDFS数据,通过Spark,Flink组件或者HudiCLI,可以将Hudi表的数据映射为Hive外部表,基于该外部表,Hive可以方便的进行实时视图,读优化视图以及增量视图的查询。 1、拷贝编译好的jar包 2、配置完后重启hive 1、使用方式         Flink hive sync现在支

    2024年02月07日
    浏览(34)
  • Hudi-集成 Hive

    Hudi 源表对应一份 HDFS 数据,通过 Spark,Flink 组件或者 Hudi CLI,可以将 Hudi 表的数据映射为 *Hive 外部表* ,基于该外部表, Hive可以方便的进行实时视图,读优化视图以及增量视图的查询。 集成步骤 以 hive3.1.2、hudi 0.12.0为例,其他版本类似。 (1)拷贝编译好的jar包 将 hudi-

    2024年02月01日
    浏览(28)
  • Hudi-集成Spark之spark-sql方式

    启动spark-sql 创建表 建表参数: 参数名 默认值 说明 primaryKey uuid 表的主键名,多个字段用逗号分隔。同 hoodie.datasource.write.recordkey.field preCombineField 表的预合并字段。同 hoodie.datasource.write.precombine.field type cow 创建的表类型: type = ‘cow’ type = \\\'mor’同 hoodie.datasource.write.table.ty

    2024年02月05日
    浏览(47)
  • Hudi0.14.0集成Spark3.2.3(Spark Shell方式)

    1.1 启动Spark Shell

    2024年01月24日
    浏览(38)
  • 基于数据湖的流批一体:flink1.15.3与Hudi0.12.1集成,并配置基于CDH6.3.2的hive catalog

    前言:为实现基于数据湖的流批一体,采用业内主流技术栈hudi、flink、CDH(hive、spark)。flink使用sql client与hive的catalog打通,可以与hive共享元数据,使用sql client可操作hive中的表,实现批流一体;flink与hudi集成可以实现数据实时入湖;hudi与hive集成可以实现湖仓一体,用flink实

    2024年02月12日
    浏览(57)
  • Hudi0.14.0 集成 Spark3.2.3(IDEA编码方式)

    本次在IDEA下使用Scala语言进行开发,具体环境搭建查看文章 IDEA 下 Scala Maven 开发环境搭建。 1.1 添加maven依赖 创建Maven工程,pom文件:

    2024年01月24日
    浏览(44)
  • Hudi集成Hive时的异常解决方法 java.lang.ClassNotFoundException: org.apache.hudi.hadoop.HoodieParquetInputFormat

    使用 Hive CLI 连接 Hive 3.1.2 并查询对应的 Hudi 映射的 Hive 表,发现如下异常: 根据报错信息 Caused by: java.lang.ClassNotFoundException: org.apache.hudi.hadoop.HoodieParquetInputFormat 推断时缺少相应的 Jar 包所导致的异常。 翻看 Hudi 0.10.0 集成 Hive 的文档,文档链接,可以看到需要将 hudi-hadoop-m

    2024年02月01日
    浏览(58)
  • 通过源代码修改使 Apache Hudi 支持 Kerberos 访问 Hive 的功能

    本文档主要用于阐释如何基于 Hudi 0.10.0 添加支持 Kerberos 认证权限的功能。 主要贡献: 针对正在使用的 Hudi 源代码进行 Kerberos-support 功能扩展,总修改规模囊括了 12 个文件约 20 处代码共计 约 200 行代码; 对 Hudi 0.10.0 的源代码进行了在保持所有自定义特性的基础上,支持了

    2024年02月14日
    浏览(43)
  • Doris-05-集成Spark、Flink、Datax,以及数据湖分析(JDBC、ODBC、ES、Hive、多源数据目录Catalog)

    准备表和数据: Spark 读写 Doris Spark Doris Connector 可以支持通过 Spark 读取 Doris 中存储的数据,也支持通过Spark写入数据到Doris。 代码库地址:https://github.com/apache/incubator-doris-spark-connector 支持从 Doris 中读取数据 支持 Spark DataFrame 批量/流式 写入 Doris 可以将 Doris 表映射为 DataFra

    2024年02月06日
    浏览(62)
  • Spark面试整理-Spark集成Hive

    Apache Spark与Apache Hive的集成使得Spark能够直接对存储在Hive中的数据进行读取、处理和分析。这种集成利用了Spark的高性能计算能力和Hive的数据仓库功能。以下是Spark集成Hive的关键方面: 1. 启用Hive支持 要在Spark中使用Hive,需要确保Spark编译时包含了对Hive的支持。在使用Spar

    2024年04月22日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包