Hudi第四章:集成Hive

本文介绍了如何在Hudi中集成Spark、Flink以及使用catalog连接Hive,包括环境配置、jar包复制、配置模板和案例实操,指出Hudi技术尚不成熟,需自行处理依赖问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

Hudi第一章:编译安装
Hudi第二章:集成Spark
Hudi第二章:集成Spark(二)
Hudi第三章:集成Flink
Hudi第四章:集成Hive



前言

本来关于Flink还有一些内容,但剩下的我了解过之后,觉得并不是很常用,而且 比较杂,所以还是决定需要的时候再学习吧。


一、环境准备

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/

启动hive

二、Flink集成hive

1.配置模版

## 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的端口
);

2.案例实操

在flinksql客户端中执行。

CREATE TABLE t10(
  id int,
  num int,
  ts int,
  primary key (id) not enforced
)
PARTITIONED BY (num)
with(
  'connector'='hudi',
  'path' = 'hdfs://hadoop102:8020/tmp/hudi_flink/t10',
  'table.type'='COPY_ON_WRITE', 
  'hive_sync.enable'='true', 
  'hive_sync.table'='h10', 
  'hive_sync.db'='default', 
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'thrift://hadoop102:9083'
);

在这里插入图片描述
然后随便插入一条数据。

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

然后我们新开一个窗口,用客户端连接hive,也可以用其它可视化连接器。
bin/beeline -u jdbc:hive2://hadoop102:10000 -n atguigu
可以看到这里已经有一张表同步过来了
在这里插入图片描述
在这里插入图片描述

三、spark集成hive

1.配置模版

  option("hoodie.datasource.hive_sync.enable","true").                         //设置数据集注册并同步到hive
  option("hoodie.datasource.hive_sync.mode","hms").                         //使用hms
  option("hoodie.datasource.hive_sync.metastore.uris", "thrift://ip:9083"). //hivemetastore地址
  option("hoodie.datasource.hive_sync.username","").                          //登入hiveserver2的用户
  option("hoodie.datasource.hive_sync.password","").                      //登入hiveserver2的密码
  option("hoodie.datasource.hive_sync.database", "").                   //设置hudi与hive同步的数据库
  option("hoodie.datasource.hive_sync.table", "").                        //设置hudi与hive同步的表名
  option("hoodie.datasource.hive_sync.partition_fields", "").               //hive表同步的分区列
  option("hoodie.datasource.hive_sync.partition_extractor_class", "org.apache.hudi.hive.MultiPartKeysValueExtractor"). // 分区提取器 按/ 提取分区

2.案例实操

打开shell后输入以下内容

import org.apache.hudi.QuickstartUtils._
import scala.collection.JavaConversions._
import org.apache.spark.sql.SaveMode._
import org.apache.hudi.DataSourceReadOptions._
import org.apache.hudi.DataSourceWriteOptions._
import org.apache.hudi.config.HoodieWriteConfig._

val tableName = "hudi_trips_cow"
val basePath = "file:///tmp/hudi_trips_cow"
val dataGen = new DataGenerator

val inserts = convertToStringList(dataGen.generateInserts(10))
val df = spark.read.json(spark.sparkContext.parallelize(inserts, 2))
        .withColumn("a",split(col("partitionpath"),"\\/")(0))
        .withColumn("b",split(col("partitionpath"),"\\/")(1))
        .withColumn("c",split(col("partitionpath"),"\\/")(2))
df.write.format("hudi").
  options(getQuickstartWriteConfigs).
  option(PRECOMBINE_FIELD_OPT_KEY, "ts").
  option(RECORDKEY_FIELD_OPT_KEY, "uuid").
  option("hoodie.table.name", tableName). 
  option("hoodie.datasource.hive_sync.enable","true").
  option("hoodie.datasource.hive_sync.mode","hms").
  option("hoodie.datasource.hive_sync.metastore.uris", "thrift://hadoop102:9083").
  option("hoodie.datasource.hive_sync.database", "default").
  option("hoodie.datasource.hive_sync.table", "spark_hudi").
  option("hoodie.datasource.hive_sync.partition_fields", "a,b,c").
  option("hoodie.datasource.hive_sync.partition_extractor_class", "org.apache.hudi.hive.MultiPartKeysValueExtractor").
  mode(Overwrite).
  save(basePath)

之后再次去hive查看
在这里插入图片描述

四、使用catalog

1.环境配置

需要的jar包。
https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-hive-3.1.2_2.12/1.13.6/flink-sql-connector-hive-3.1.2_2.12-1.13.6.jar

下载之后需要修改,用压缩软件打开。
在这里插入图片描述
在这里插入图片描述
将其删除。
然后将整个jar包上传到flink的lib目录下。
在这里插入图片描述

2.案例实操

我们这里使用flink进行操作,由于flink是静态加载,所以我们需要从其session。
现在我们默认只有一个catalog
在这里插入图片描述
我们创建一个hive的catalog用于和hive连接。

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

use catalog hive_catalog;

在这里插入图片描述
可以看到此时我们的flink已经连接到hive了,这样就不用总是切换了。
在这里插入图片描述


总结

hudi的内容暂时就到这里,学习的过程中觉得hudi的技术还不是很成熟,很多地方的依赖需要自己修改,所以这次就不再进行太深层次的学习了。

<think>好的,我需要帮助用户了解如何在Hive中使用HudiHudiHive集成方案。首先,我应该回顾用户提供的引用内容,看看里面有哪些关键信息。 根据引用[1],Hudi数据可以手动创建Hive表来映射,并且使用Hive SQL操作Hudi数据,尤其是MOR模式。引用[2]提到Hudi表在Hive Metastore中注册为标准表,可以像普通Hive表一样查询,同时支持时间旅行和增量查询。引用[3]提供了环境准备的步骤,比如拷贝必要的jar包到Hive的lib目录下。引用[4]则提到在写入数据时同步Hive参数,生成对应的Hive表。 首先,我需要整理集成步骤。环境准备是第一步,需要将Hudi相关的jar包复制到Hive的lib目录,如hudi-hadoop-mr-bundle和hudi-hive-sync-bundle,然后重启Hive服务。接下来,手动创建Hive表来映射Hudi数据,注意指定存储格式为org.apache.hudi,以及输入输出格式。对于自动同步表结构的情况,需要在写入Hudi数据时配置Hive Sync参数,比如hoodie.datasource.hive_sync.*相关参数,这样在写入时自动同步到Hive Metastore。 然后,查询Hudi表时,用户可以直接使用Hive SQL,但要注意可能需要设置一些参数,比如使用Hive的InputFormat。对于增量查询,需要设置hoodie.*.consume模式和相关参数,以获取特定时间后的变更数据。 用户可能的问题可能涉及性能优化、增量查询的具体配置,或者如何处理不同存储模式(如COW和MOR)在Hive中的表现。需要确保回答结构清晰,分步骤说明,并引用提供的资料来支持每个步骤。 最后,生成相关问题时要围绕HiveHudi集成的常见疑问,比如性能分析、优化方法、应用场景等。确保问题具体,能够帮助用户深入理解。</think>### HiveHudi集成方案详解 #### 1. **环境准备** 在Hive集成Hudi需要先完成以下步骤: - **拷贝JAR包**:将Hudi的依赖包(如`hudi-hadoop-mr-bundle`和`hudi-hive-sync-bundle`)复制到Hive的`lib`目录,例如: ```bash cp /path/to/hudi-hadoop-mr-bundle-*.jar /opt/module/hive/lib/ cp /path/to/hudi-hive-sync-bundle-*.jar /opt/module/hive/lib/ ``` 完成后需重启Hive服务以加载新依赖[^3]。 #### 2. **手动创建Hive表映射Hudi数据** 若Hudi数据已存在,可通过手动建表实现映射。例如,对HDFS中存储的MOR模式表: ```sql CREATE EXTERNAL TABLE hudi_table STORED BY 'org.apache.hudi' LOCATION '/hdfs/path/to/hudi_table' TBLPROPERTIES ( 'input.format' = 'org.apache.hudi.hadoop.HoodieParquetInputFormat', 'output.format' = 'org.apache.hudi.hadoop.HoodieParquetOutputFormat' ); ``` 通过`STORED BY`指定Hudi存储格式,`LOCATION`指向Hudi数据路径[^1]。 #### 3. **自动同步表结构** 在写入Hudi数据时,可通过配置参数自动同步元数据到Hive: ```java // 示例写入配置(Spark) .writeOptions( hoodie.datasource.write.recordkey.field = "id", hoodie.datasource.hive_sync.database = "default", hoodie.datasource.hive_sync.table = "hudi_table", hoodie.datasource.hive_sync.enable = "true" ) ``` 此配置会同步表名、字段、分区等信息到Hive Metastore,无需手动建表[^4]。 #### 4. **查询Hudi表** - **全量查询**:直接使用标准Hive SQL: ```sql SELECT * FROM hudi_table WHERE partition_col='value'; ``` - **增量查询**:需设置Hive参数指定时间范围或提交版本: ```sql SET hoodie.hudi_table.consume.mode=INCREMENTAL; SET hoodie.hudi_table.consume.start.timestamp=20230101000000; SELECT * FROM hudi_table; ``` 此模式仅拉取指定时间后的增量数据[^2][^4]。 #### 5. **存储模式兼容性** - **COW表**:Hive直接读取最新版本数据,无中间状态。 - **MOR表**:需通过`hoodie.*.input.format`指定合并逻辑,例如: ```sql SET hive.input.format=org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat; ``` 确保查询时合并实时文件和日志文件。 #### 6. **性能优化建议** - **分区剪枝**:利用Hive的分区过滤减少数据扫描范围。 - **压缩调度**:对MOR表定期执行压缩(`compaction`),减少小文件数量。 - **索引同步**:启用`hoodie.index.type=HIVE`保持Hive元数据与Hudi索引一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值