数据湖(五):Hudi与Hive集成
Hudi与Hive集成
一、配置HiveServer2
Hudi与Hive集成原理是通过代码方式将数据写入到HDFS目录中,那么同时映射Hive表,让Hive表映射的数据对应到此路径上,这时Hudi需要通过JDBC方式连接Hive进行元数据操作,这时需要配置HiveServer2。
1、在Hive服务端配置hive-site.xml
#在Hive 服务端 $HIVE_HOME/conf/hive-site.xml中配置:
<!-- 配置hiveserver2 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>192.168.179.4</value>
</property>
<!-- 配置hiveserver2使用的zookeeper -->
<property>
<name>hive.zookeeper.quorum</name>
<value> node3:2181,node4:2181,node5:2181</value>
</property>
注意:“hive.zookeeper.quorum”搭建hiveserver2HA使用配置项,可以不配置,如果不配置启动hiveServer2时一直连接本地zookeeper,导致大量错误日志(/tmp/root/hive.log),从而导致通过beeline连接当前node1节点的hiveserver2时不稳定,会有连接不上错误信息。
2、在每台Hadoop 节点配置core-site.xml,记得发送到所有节点
<!-- 配置代理访问用户,如果不配置下列信息 hive的jdbc连接会报错 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
3、重启HDFS ,Hive ,在Hive服务端启动Metastore 和 HiveServer2服务
4、在客户端通过beeline连接Hive
二、代码层面集成Hudi与Hive
我们可以通过SparkSQL将数据保存到Hudi中同时也映射到Hive表中。映射有两种模式,如果Hudi表是COPY_ON_WRITE类型,那么映射成的Hive表对应是指定的Hive表名,此表中存储着Hudi所有数据。
如果Hudi表类型是MERGE_ON_READ模式,那么映射的Hive表将会有2张,一张后缀为rt ,另一张表后缀为ro。后缀rt对应的Hive表中存储的是Base文件Parquet格式数据+*log* Avro格式数据,也就是全量数据。后缀为ro Hive表中存储的是存储的是Base文件对应的数据。
1)在pom.xml中加入一下依赖
<!-- 连接Hive 驱动包-->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency>
2)将对应依赖包放入Hive节点对应的lib目录下
将hudi-hadoop-mr-bundle-0.8.0.jar、parquet-column-1.10.1.jar、parquet-common-1.10.1.jar、parquet-format-2.4.0.jar、parquet-hadoop-1.10.1.jar包存入Hive lib目录下。由于Hudi表数据映射到Hive表后,Hive表底层存储格式为“HoodieParquetInputFormat”或者“HoodieParquetRealtimeInputFormat”,解析Parquet数据格式时使用到以上各个包。可以从Maven中下载以上包后,将这些包上传到所有Hive节点的lib目录下,包括服务端和客户端。
3)启动Hive MetaStore与Hive Server2服务
4)将hive-site.xml放入项目resources目录中
后期Hudi映射Hive表后,会自动检查Hive元数据,这时需要找到配置文件连接Hive。
1、COW模式-SparkSQL代码写入Hudi同时映射Hive表
1)COW模式代码如下
2)查询Hive中数据
3)更新表中数据,再次查询Hive中的数据
每次查询都是查询最后一次数据结果
2、MOR模式-SparkSQL代码写入Hudi同时映射Hive表
1)MOR代码如下
2)查询Hive表中的数据
注意:infos2_ro 中存储的只是Base文件中数据(parquet列式存储结果)
infos2_rt 中存储的是Base文件(Parquet列式存储结果)+*log*(Avro行式存储结果)
目前只有Base文件数据,查询的就是全量数据
目前只有Base文件数据,查询的就是全量数据
3)更新表中数据,再次查询Hive中的数据
查询Hive中对应两张表的数据结果
查询Base文件中的数据
查询Base文件+log文件中数据,可以看到查询到的是修改后的结果数据
三、手动层面集成Hudi与Hive
如果已经存在Hudi数据,我们也可以手动创建对应的Hive表来映射对应的Hudi数据,使用Hive SQL来操作Hudi。例如使用如下代码在HDFS中存储Hudi数据,这里采用MOR模式写入数据,方便后期测试:
1)向Hudi表中写入数据
2)在Hive中创建对应的表数据
在Hive中创建表person3_ro,映射Base数据,相当于前面的ro表:
建好以上对应的表之后,由于有分区,还看不到数据,所以这里需要我们手动映射分区数据:
查看表数据
在Hive中创建表person3_rt,映射Base+log数据,相当于rt表,并映射分区:
加载对应分区数据数据
查看结果数据
3)使用代码修改Hudi表中的数据:
修改数据如下:
4)继续查询对应的两张Hive表数据
由于分区 “ttt”是新加入的分区,需要手动添加下分区才能在对应的Hive表中正常查询
查询表person3_ro
查询表person3_rt
此外,我们也可以不需要每次都自己手动添加分区,而是创建好对应的Hive表后,在代码中向Hudi中写数据时,指定对应的Hive参数即可,这样写入的数据自动会映射到Hive中。
我们可以删除Hive对应的表数据重新创建以及第一次加载分区,再后续写入Hudi表数据时,代码如下,就不需要每次都手动加载Hive分区数据。
查询Hive表 peson3_ro数据
查询Hive表 person3_rt数据
四、SparkSQL操作映射的Hive表
将Hudi数据映射到Hive后,我们可以使用SparkSQL来进行操作Hive表进行处理。操作代码如下:
我们可以看到如果针对Hudi表中的数据进行修改,那么SpakSQL读取到的就是最新修改后的结果数据。
- 点赞
- 收藏
- 关注作者
评论(0)