Hudi系列13:Hudi集成Hive

news2024/12/24 9:13:00

文章目录

  • 一. Hudi集成Hive概述
  • 二. Hudi集成Hive步骤
    • 2.1 拷贝jar包
      • 2.1.1 拷贝编译好的hudi的jar包
      • 2.1.2 拷贝Hive jar包到Flink lib目录
      • 2.1.3 Flink以及Flink SQL连接Hive的jar包
    • 2.2 重启hive
    • 2.3 Flink访问Hive表
      • 2.3.1 启动Flink SQL Client
      • 2.3.2 创建hive catalog
      • 2.3.3 切换 catalog
      • 2.3.4 查询Hive表
    • 2.4 Flink 同步Hive
  • 三. 实操案例(COW)
    • 3.1 在内存中创建hudi表(不使用catalog)
    • 3.2 在catalog中创建hudi表
      • 3.2.1 指定到hive目录之外
      • 3.2.2 指定到hive目录之内
      • 3.2.3 使用参数指定hudi表分区
  • 四. 实操案例(MOR)
    • 4.1 在内存中创建hudi表(不使用catalog)
  • FAQ:
    • FAQ1: NoClassDefFoundError ParquetInputFormat
  • 参考:

一. Hudi集成Hive概述

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

二. Hudi集成Hive步骤

以 Hive 3.1.2、hudi 0.12.0 为例。

2.1 拷贝jar包

2.1.1 拷贝编译好的hudi的jar包

将hudi-hive-sync-bundle-0.12.0.jar 和 hudi-hadoop-mr-bundle-0.12.0.jar 放到hive节点的lib目录下

cd /home/hudi-0.12.0/packaging/hudi-hive-sync-bundle/target
cp ./hudi-hive-sync-bundle-0.12.0.jar /home/apache-hive-3.1.2-bin/lib/
cd /home/hudi-0.12.0/packaging/hudi-hadoop-mr-bundle/target
cp ./hudi-hadoop-mr-bundle-0.12.0.jar /home/apache-hive-3.1.2-bin/lib/

2.1.2 拷贝Hive jar包到Flink lib目录

将Hive的lib拷贝到Flink的lib目录

cd $HIVE_HOME/lib
cp ./hive-exec-3.1.2.jar $FLINK_HOME/lib/
cp ./libfb303-0.9.3.jar $FLINK_HOME/lib/

https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/connectors/table/hive/overview/
image.png

2.1.3 Flink以及Flink SQL连接Hive的jar包

wget https://repo.maven.apache.org/maven2/org/apache/flink/flink-connector-hive_2.12/1.14.5/flink-connector-hive_2.12-1.14.5.jar
wget https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-hive-3.1.2_2.12/1.14.5/flink-sql-connector-hive-3.1.2_2.12-1.14.5.jar

image.png

2.2 重启hive

拷贝jar包之后,需要重启hive

2.3 Flink访问Hive表

2.3.1 启动Flink SQL Client

# 启动yarn session(非root账户)
/home/flink-1.14.5/bin/yarn-session.sh -d  2>&1 &

# 在yarn session模式下启动Flink SQL
/home/flink-1.14.5/bin/sql-client.sh embedded -s yarn-session

2.3.2 创建hive catalog

CREATE CATALOG hive_catalog WITH (
    'type' = 'hive',
    'default-database' = 'default',
    'hive-conf-dir' = '/home/apache-hive-3.1.2-bin/conf'
);

image.png

2.3.3 切换 catalog

use catalog hive_catalog;

image.png

2.3.4 查询Hive表

use test;
show tables;
-- Flink可以直接读取hive表
select * from t1;

image.png

image.png

2.4 Flink 同步Hive

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

配置模板:
image.png

三. 实操案例(COW)

3.1 在内存中创建hudi表(不使用catalog)

代码:


-- 创建表
create table t_cow1 (
  id     int primary key,
  num    int,
  ts     int
)
partitioned by (num)
with (
  'connector' = 'hudi',
  'path' = 'hdfs://hp5:8020/tmp/hudi/t_cow1',
  'table.type' = 'COPY_ON_WRITE',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = 't_cow1',
  'hive_sync.db' = 'test',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'thrift://hp5:9083',
  'hive_sync.conf.dir'='/home/apache-hive-3.1.2-bin/conf'
);




-- 只有在写数据的时候才会触发同步Hive表
insert into t_cow1 values (1,1,1);

测试记录:
Flink SQL运行记录:
image.png

Hive的test库下面多了一个t_cow1 表
image.png

Hive端查询数据:
image.png

3.2 在catalog中创建hudi表

3.2.1 指定到hive目录之外

代码:

-- 创建目录
CREATE CATALOG hive_catalog WITH (
    'type' = 'hive',
    'default-database' = 'default',
    'hive-conf-dir' = '/home/apache-hive-3.1.2-bin/conf'
);
        
-- 进入目录
USE CATALOG hive_catalog;

use test;

  -- 创建表
create table t_catalog_cow1 (
  id     int primary key,
  num    int,
  ts     int
)
partitioned by (num)
with (
  'connector' = 'hudi',
  'path' = 'hdfs://hp5:8020/tmp/hudi/t_catalog_cow1',
  'table.type' = 'COPY_ON_WRITE',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = 't_catalog_cow1',
  'hive_sync.db' = 'test',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'thrift://hp5:9083',
  'hive_sync.conf.dir'='/home/apache-hive-3.1.2-bin/conf'
);


insert into t_catalog_cow1 values (1,1,1);

测试记录:
Flink SQL 这边是可以查看到表
image.png
Flink SQL查询数据也没问题
image.png

Hive端可以看到表,但是查询不到数据:
image.png

Hive端查看建表语句:
image.png

发现问题:
COW的表从hudi同步过来之后,直接少了partition字段。
也就是相当于在使用hive catalog的情况下,通过FLink创建的Hudi表自动同步到Hive这边是存在一定的问题的
image.png

3.2.2 指定到hive目录之内

代码:

-- 创建目录
CREATE CATALOG hive_catalog WITH (
    'type' = 'hive',
    'default-database' = 'default',
    'hive-conf-dir' = '/home/apache-hive-3.1.2-bin/conf'
);
        
-- 进入目录
USE CATALOG hive_catalog;

use test;

  -- 创建表
create table t_catalog_cow2 (
  id     int primary key,
  num    int,
  ts     int
)
partitioned by (num)
with (
  'connector' = 'hudi',
  'path' = 'hdfs://hp5:8020/user/hive/warehouse/test.db/t_catalog_cow2',
  'table.type' = 'COPY_ON_WRITE',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = 't_catalog_cow2',
  'hive_sync.db' = 'test',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'thrift://hp5:9083',
  'hive_sync.conf.dir'='/home/apache-hive-3.1.2-bin/conf'
);


insert into t_catalog_cow2 values (1,1,1);

测试记录:
问题依旧存在
image.png

3.2.3 使用参数指定hudi表分区

代码:

create table t_catalog_cow4 (
  id     int primary key,
  num    int,
  ts     int
)
partitioned by (num)
with (
  'connector' = 'hudi',
  'path' = 'hdfs://hp5:8020/tmp/hudi/t_catalog_cow4',
  'table.type' = 'COPY_ON_WRITE',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = 't_catalog_cow4',
  'hive_sync.db' = 'test',
  'hoodie.datasource.write.keygenerator.class' = 'org.apache.hudi.keygen.ComplexAvroKeyGenerator',
  'hoodie.datasource.write.recordkey.field' = 'id',
  'hoodie.datasource.write.hive_style_partitioning' = 'true',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'thrift://hp5:9083',
  'hive_sync.conf.dir'='/home/apache-hive-3.1.2-bin/conf',
  'hive_sync.partition_fields' = 'dt',
  'hive_sync.partition_extractor_class' = 'org.apache.hudi.hive.HiveStylePartitionValueExtractor'
);


insert into t_catalog_cow4 values (1,1,1);

测试记录:
image.png

四. 实操案例(MOR)

4.1 在内存中创建hudi表(不使用catalog)

代码:

-- 创建表
create table t_mor1 (
  id     int primary key,
  num    int,
  ts     int
)
partitioned by (num)
with (
  'connector' = 'hudi',
  'path' = 'hdfs://hp5:8020/tmp/hudi/t_mor1',
  'table.type' = 'MERGE_ON_READ',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = 't_mor1',
  'hive_sync.db' = 'test',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'thrift://hp5:9083',
  'hive_sync.conf.dir'='/home/apache-hive-3.1.2-bin/conf'
);

-- 只有在写数据的时候才会触发同步Hive表
-- Hive只能读取Parquet的数据,MOR的表不会立马生成Parquet文件,需要多录入几条数据,或者使用Spark-SQL再多录入几条数据
insert into t_mor1 values (1,1,1);

测试记录:
HDFS:
只有log,没有Parquet文件
image.png

insert into t_mor1 values (2,1,2);
insert into t_mor1 values (3,1,3);
insert into t_mor1 values (4,1,4);
insert into t_mor1 values (5,1,5);

Flink WEB:
image.png

多了几个表:
t_mor1 是hudi表,通过Flink可以进行读写
image.png
t_mor1_ro、t_mor1_rt hive表,可以通过Hive、Spark进行操作
image.png

Hive端查看数据:
因为没有parquet文件,所以没有数据生成

加入了很多的测试数据,结果依旧是log文件而没有parquet文件…
image.png

退出重新登陆:
Flink SQL 客户端这边 看不到之前的表了
image.png

Hive这边,退出重新登陆,依旧是存在的。

FAQ:

FAQ1: NoClassDefFoundError ParquetInputFormat

问题描述:
在Flink SQL客户端查询COW表的时候报错

[ERROR] Could not execute SQL statement. Reason:
java.lang.NoClassDefFoundError: org/apache/parquet/hadoop/ParquetInputFormat

image.png

解决方案:
找到hudi编译时候的parquet的包,拷贝到flink的lib目录
image.png

参考:

  1. https://hudi.apache.org/cn/docs/syncing_metastore/
  2. https://dongkelun.com/2022/08/26/flinkSqlClientQueryHive/
  3. https://www.modb.pro/db/539792

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cpanel面板的虚拟主机重装wordpress

cpanel面板的虚拟主机重装wordpress很多朋友购买的虚拟主机都是采用的cPanel面板。想要重装WordPress的话,跟着以下步骤操作即可。登录cPanel管理后台,进入文件管理;删除网站的所有文件(如果有需要请先备份然后下载到本地&#xf…

Ubuntu18.04 gRPC编译安装

一、CMake版本检查 grpc编译cmake要求最低版本为3.15。首先,cmake -version 查看当前cmake版本,如果低于3.15,按照以下步骤进行安装。 1.1 卸载已经安装的旧版的CMake sudo apt-get autoremove cmake 1.2 下载最新版本CMake CMake下载地…

2023年湖北中级工程师职称怎么评?甘建二告诉你

春季开始了,又到了职称评审正式申报提交资料的时候了,很多想评职称的小伙伴都不知道中级职称要怎么评?需要本人提供什么资料?配合哪些事情?怎么评一个中级职称呢?接下来甘建二老师跟您一起来看看&#xff1…

Redis性能问题排查指引

目录 Redis性能问题排查手段 1. 定位问题点 2. 定位Redis具体性能问题 参考: Redis性能问题排查手段 1. 定位问题点 当发生业务系统访问Redis慢或者超时异常时,可能的原因有以下三个: 客户端问题: 如果客户端使用的是Java版…

VueJS 之组件的生命周期

文章目录参考描述生命周期生命周期图示生命周期钩子组件创建阶段组件运行阶段组件销毁阶段举个栗子参考 项目描述搜索引擎Bing哔哩哔哩黑马程序员VueJS官方文档 描述 项目描述Edge109.0.1518.70 (正式版本) (64 位)操作系统Windows 10 专业版vue/cli5.0.8npm8.19.3VueJS2.6.1…

实战30:基于Open CV的车道线检测 附完整代码

车道线检测,在色彩切片、边界提取处,可以选用许多不同的方法来实现。色彩切片处是希望通过车道线的颜色特征:白色或者黄色来提取车道线,白色和黄色单独提取后两者图像相加便得到了同时含有白色车道和黄色车道的图像。色彩切片步骤的关键在于如何获得较为纯净的车道线,以让…

Java JVM:Java 内存模型与线程(七)

衡量一个服务性能的高低好坏,每秒事物处理数(TPS)是重要的指标之一,而 TPS 值与程序的并发能力又有非常密切的关系 目录一、硬件的效率与一致性二、Java 内存模型三、Java 与线程这里是看书笔记,之前文章也有相关介绍&…

操作系统权限提升(八)之系统错误配置-注册表键AlwaysInstall提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

异质性区域下的宏观基本图构建

这是我们发表在Physica A: Statistical Mechanics and its Applications期刊上的一篇论文,主要是对现在的宏观基本图构建进行了一定的优化,论文详见:https://www.sciencedirect.com/science/article/pii/S0378437123000869 1.论文概述 论文…

stream操作常用API 示例详解

简介 从JDK8开始,增加了一新特性Stream流式操作,Stream中提供了非常多的API供大家使用,灵活的使用这些API,可以非常的方便且优美的实现我们的代码逻辑。 流式操作主要用来处理数据(比如集合),…

Java两大工具库:Commons和Guava(4)

您好,我是湘王,这是我的CSDN博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!在Nginx中提到过…

说一下Vue组件中的自定义事件和全局事件总线

一,自定义事件 1.自定义事件是什么 自定义事件一种组件间通信的方式,适用于 子组件 ——> 父组件传输数据等 2.要在什么地方使用 若App是父组件,School是子组件,School想给App传数据,那么就要在App中给School绑…

MySQL表中的聚合查询

聚合查询在MySQL初阶中进行的查询都是对于同一条记录的列与列之间进行的运算,那如何对多条记录的不同行进行运算呢(比如计算所有同学某一单科的总分,某一单科的平均分)?此时就需要聚合查询来操作了!1.聚合函数函数 说明COUNT([DISTINCT] expr)返回查询到的数据的数量SUM([DIST…

pod访问不通问题--kube-proxy未正常创建

用户问题Pod创建后访问对象存储OSS不通。初步排查初步排查,网络连通性是OK的。再次反馈创建Pod后2分钟内可能存在业务不通。业务架构该集群采用了节点自动弹缩功能,节点弹缩范围在13-28之间。用户周期性创建大批量Pod,共300个,与对…

46_API接口漏洞

API接口漏洞 一、概念 api > application interface 应用接口 向特定的接口发送一个请求包 返回一个类似于json格式的字符串 二、REST型web service 可以从网上去搜索下api接口去理解,下面有个我找到的网址,给出api接口的分类 https://blog.csdn.net/t79036912/article…

Linux(Ubuntu)通过NFS服务挂载群晖NAS为虚拟磁盘

1. 设置NAS,共享目录 1. 文件服务 设置 首先进入NAS服务,打开 [控制面板] ,在控制面版包含** 文件服务 ** 功能如图所示。 2.选中要共享的文件夹后,点击操作栏的 【编辑】 按钮,如图: 3.进入编辑面板后&a…

盘点三个超好用的截图软件

一款好用的截图软件往往能给人们带来更高的工作效率,目前市面上的截图软件已经很多,今天就给大家盘点一些好用的截图软件。 QQ截图 QQ截图软件是QQ内置自带的一款截图,快捷键ctrlA 可以唤起,其功能也是应有尽有包括屏幕录制&#…

【JavaScript】数据劫持(代理)详解

💻 【JavaScript】数据劫持(代理)详解 🏠专栏:JavaScript 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向:目前主攻…

3万行代码硬撸一个一键发布文章工具,简直不要太好用,从此写文章,发文章,太简单了好伐

theme: channing-cyan highlight: github-gist 本人6年前端开发老鸟- 【程序员蜗牛】,欢迎沟通交流 操作演示(视频) 视频演示 项目背景 程序员工作中,不免会遇到一些技术难题,然后通过不懈努力将问题攻克&#xf…

1x1卷积、Inception网络、

目录1.1x1卷积(1x1 convolution)又称网络中的网络(network in network)池化层只能压缩图像的宽和高,1x1卷积能压缩通道数量,减少计算成本。如上图,输入维度的通道数为192,用32个1x1x192的filters,就能将输出的通道数压…