数据湖(五):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 中配置: hive.server2.thrift.port10000hive.server2.thrift.bind.host192.168.179.4hive.zookeeper.quorumnode3:2181,node4:2181,node5:2181

注意:“hive.zookeeper.quorum”搭建 hiveserver2HA 使用配置项,可以不配置,如果不配置启动 hiveServer2 时一直连接本地 zookeeper,导致大量错误日志(/tmp/root/hive.log),从而导致通过 beeline 连接当前 node1 节点的 hiveserver2 时不稳定,会有连接不上错误信息。

2、在每台 Hadoop 节点配置 core-site.xml,记得发送到所有节点

hadoop.proxyuser.root.hosts\*hadoop.proxyuser.root.groups\*

3、重启 HDFS ,Hive ,在 Hive 服务端启动 Metastore 和 HiveServer2 服务

[root@node1 conf]# hive --service metastore &[root@node1 conf]# hive --service hiveserver2 &

复制代码

4、在客户端通过 beeline 连接 Hive

[root@node3 test]# beelinebeeline> !connect jdbc:hive2://node1:10000 rootEnter password for jdbc:hive2://node1:10000: **** #可以输入任意密码,没有验证0: jdbc:hive2://node1:10000> show tables;

复制代码

二、代码层面集成 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 中加入一下依赖

<**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 服务

[root@node1 conf]# hive --service metastore &[root@node1 conf]# hive --service hiveserver2 &

复制代码

4)将 hive-site.xml 放入项目 resources 目录中

后期 Hudi 映射 Hive 表后,会自动检查 Hive 元数据,这时需要找到配置文件连接 Hive。

1、COW 模式-SparkSQL 代码写入 Hudi 同时映射 Hive 表

1)COW 模式代码如下

//1.创建对象val session: SparkSession = SparkSession.builder().master("local").appName("insertDataToHudi")  .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")  .getOrCreate()
//2.创建DataFrameval insertDF: DataFrame = session.read.json("file:///D:\\2022IDEA_space\\SparkOperateHudi\\data\\jsondata.json")
import org.apache.spark.sql.functions._//3.向Hudi中插入数据 - COW模式insertDF  .write.format("hudi")  //设置写出模式,默认就是COW  .option(DataSourceWriteOptions.TABLE_TYPE_OPT_KEY,DataSourceWriteOptions.COW_TABLE_TYPE_OPT_VAL)  //设置主键列名称  .option(DataSourceWriteOptions.RECORDKEY_FIELD_OPT_KEY, "id")  //当数据主键相同时,对比的字段,保存该字段大的数据  .option(DataSourceWriteOptions.PRECOMBINE_FIELD_OPT_KEY, "data_dt")  //指定分区列  .option(DataSourceWriteOptions.PARTITIONPATH_FIELD_OPT_KEY, "loc")  //并行度设置  .option("hoodie.insert.shuffle.parallelism", "2")  .option("hoodie.upsert.shuffle.parallelism", "2")  //表名设置  .option(HoodieWriteConfig.TABLE_NAME, "person_infos")  //关于Hive设置  //指定HiveServer2 连接url  .option(DataSourceWriteOptions.HIVE_URL_OPT_KEY,"jdbc:hive2://node1:10000")  //指定Hive 对应的库名  .option(DataSourceWriteOptions.HIVE_DATABASE_OPT_KEY,"default")  //指定Hive映射的表名称  .option(DataSourceWriteOptions.HIVE_TABLE_OPT_KEY,"infos1")  //Hive表映射对的分区字段  .option(DataSourceWriteOptions.HIVE_PARTITION_FIELDS_OPT_KEY,"loc")  //当设置为true时,注册/同步表到Apache Hive metastore,默认是false,这里就是自动创建表  .option(DataSourceWriteOptions.HIVE_SYNC_ENABLED_OPT_KEY,"true")  //如果分区格式不是yyyy/mm/dd ,需要指定解析类将分区列解析到Hive中  .option(DataSourceWriteOptions.HIVE_PARTITION_EXTRACTOR_CLASS_OPT_KEY,classOf[MultiPartKeysValueExtractor].getName)  .mode(SaveMode.Append)  .save("/hudi_data/person_infos")

复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值