湖仓一体之Apache Hudi

Apache Hudi 详细介绍

一、Hudi 是什么

Apache Hudi
Hudi(Hadoop Upserts Deletes and Incrementals)是一个面向数据湖(Data Lake)的开放表格式(Open Table Format)与数据管理框架,主要解决:

  • 数据湖实时写入

  • Upsert(更新插入)

  • Delete(删除)

  • 增量查询

  • 流批一体

  • 小文件治理

  • 数据版本管理

  • CDC(Change Data Capture)

本质上:

Hudi = “支持数据库能力的数据湖表格式”

它让:

  • HDFS

  • S3

  • OSS

  • GCS

上的 Parquet 文件,具备:

  • 类数据库事务

  • ACID

  • 实时更新

  • 时间旅行

  • 增量消费

能力。

官方地址:

Apache Hudi Official Site

GitHub:

Apache Hudi GitHub


二、为什么会出现 Hudi

传统 Hive 数仓存在几个问题:

问题原因
只能 AppendParquet 文件不可更新
更新代价巨大UPDATE 本质是重写整个分区
实时性差T+1
小文件严重Streaming 写入
无增量消费只能全表扫描
CDC 困难无变更日志
流批割裂Kafka/Hive 两套系统

例如:

订单表:

order_idstatus
1paid

后面变成:

order_idstatus
1shipped

Hive 需要:

  • 重刷分区

  • 重写文件

代价巨大。

于是出现:

  • Apache Hudi

  • Apache Iceberg

  • Delta Lake

三大湖仓表格式。


三、Hudi 核心目标

Hudi 的核心目标:

目标说明
流式写入支持 Kafka/Flink/Spark
实时查询秒级可见
Upsert/Delete类数据库更新
增量拉取CDC
ACID事务一致性
小文件治理自动 Compaction
时间旅行查询历史版本
流批一体Streaming + Batch

四、Hudi 架构

整体架构

                +------------------+
                | Kafka / CDC / MQ |
                +------------------+
                         |
                  Flink / Spark
                         |
                 Hudi Write Client
                         |
      +--------------------------------------+
      |             Hudi Table               |
      |--------------------------------------|
      | .hoodie/ 元数据                      |
      | parquet base files                   |
      | log files(avro log)                  |
      +--------------------------------------+
                         |
         +-------------------------------+
         | Hive / Spark / Trino / Presto |
         +-------------------------------+

五、Hudi 核心概念


1. Table Type(表类型)

Hudi 最核心的概念。

支持两种:

类型特点
Copy On Write(COW)更新时重写 Parquet
Merge On Read(MOR)更新写 Log,异步合并

六、COW(Copy On Write)

工作原理

更新数据时:

旧 parquet
    ↓
读取
    ↓
合并新数据
    ↓
生成新 parquet

即:

Rewrite File


特点

优点缺点
查询快写入慢
适合 OLAP更新代价高
无 Log 合并IO 大

适用场景

适合:

  • BI

  • 报表

  • 查询多

  • 更新少

例如:

  • 用户画像

  • 商品维表

  • 宽表


七、MOR(Merge On Read)

工作原理

更新:

新数据
   ↓
append log file

查询时:

base parquet + log
        ↓
merge

后台:

compaction

合并生成新 parquet。


MOR 架构

base file.parquet
delta log1.avro
delta log2.avro
delta log3.avro

特点

优点缺点
写入快查询慢
实时性强需要 compaction
Streaming 友好架构复杂

适合场景

  • CDC

  • 实时数仓

  • 高频更新

  • IoT

  • 用户行为


八、Hudi Timeline(时间线)

Hudi 最大特色之一。

所有操作:

  • commit

  • clean

  • compaction

  • rollback

都记录到:

.hoodie/

中。


Timeline 示例

20250510120000.commit
20250510121000.commit
20250510121500.compaction

Timeline 的价值

支持:

能力说明
Time Travel查询历史版本
增量消费获取变更
回滚rollback
审计操作历史

九、Hudi 文件布局

table/
 ├── .hoodie/
 ├── partition1/
 │    ├── file1.parquet
 │    ├── file1.log
 │
 ├── partition2/

十、Record Key

类似数据库主键。

例如:

order_id

用于:

  • 去重

  • 更新定位

  • Upsert


十一、PreCombine Key

用于解决:

同一主键多条记录冲突

例如:

ts 时间戳

保留最新记录。


十二、Index(索引)

Hudi 必须知道:

某条数据在哪个文件

因此需要索引。


Hudi 索引类型

索引特点
Bloom Index默认
Simple Index简单
HBase Index外部索引
Bucket Index类 Hash
Metadata Index元数据索引

Bloom Index

核心思想:

文件 -> bloom filter -> 判断 key 是否存在

避免全表扫描。


十三、Compaction(压缩)

MOR 核心机制。

为什么需要

Log 文件不断增长:

.parquet + .log + .log + .log

查询越来越慢。


Compaction 作用

把:

base + log

合并成:

new parquet

Compaction 策略

策略说明
按时间定时
按 log 数量阈值
按文件大小自动

十四、Clustering(聚簇)

用于:

  • 小文件治理

  • 文件重排

  • 数据排序

类似:

OPTIMIZE

作用

例如:

10000 小文件
→
100 大文件

提升查询性能。


十五、Cleaner(清理)

删除旧版本文件。

否则:

版本越来越多

存储爆炸。


Cleaner 策略

策略说明
KEEP_LATEST_COMMITS保留最近 commit
KEEP_LATEST_FILE_VERSIONS保留文件版本

十六、Incremental Query(增量查询)

Hudi 非常强大的能力。

例如:

begin_time='20250510'

只获取:

新增/更新数据

价值

可实现:

  • CDC

  • 增量同步

  • 流式 ETL

  • 数据订阅


十七、Time Travel(时间旅行)

查询历史版本。

例如:

as.of.instant='20250510120000'

十八、ACID 事务

Hudi 支持:

能力支持
原子性YES
一致性YES
隔离性MVCC
持久性YES

十九、MVCC

Hudi 使用:

Multi Version Concurrency Control

实现:

  • 读写隔离

  • Snapshot Query


二十、查询类型

1. Snapshot Query

查:

最新数据

2. Read Optimized Query

只读 parquet:

忽略 log

适合:

  • BI

  • OLAP


3. Incremental Query

只读变更。


二十一、Hudi 写入模式


INSERT

新增。


UPSERT

更新插入。

最常用。


BULK_INSERT

大批量导入。


DELETE

删除。


二十二、Flink + Hudi

这是当前主流。

架构

Kafka CDC
    ↓
Flink
    ↓
Hudi
    ↓
Trino/Spark

优势

优势说明
实时写入秒级
Exactly Once精确一次
CDC 支持MySQL binlog
流批一体YES

二十三、Spark + Hudi

早期主流方案。

特点

优势缺点
生态成熟Streaming 弱
批处理强延迟高

二十四、Hudi 元数据表(Metadata Table)

用于解决:

S3 LIST 太慢

问题。


存储内容

内容说明
文件列表file listing
column stats列统计
bloom filterbloom 索引

二十五、Hudi 与 Iceberg 对比

对比HudiIceberg
更新能力
CDC一般
实时写入
流式支持一般
查询性能
大分析一般
小文件治理
时间旅行支持支持
生态非常强

二十六、Hudi 与 Delta Lake 对比

对比HudiDelta
开源开放ApacheLinux Foundation
Streaming
Flink 支持一般
Spark 绑定
云生态Databricks 强

二十七、Hudi 典型应用场景


1. CDC 实时数仓

MySQL -> Flink CDC -> Hudi

2. 用户画像

频繁更新。


3. IoT

设备状态持续变化。


4. 风控

实时特征更新。


5. AI Feature Store

在线离线特征同步。

结合:

  • Kafka

  • Flink

  • Hudi

  • Redis

实现实时特征平台。


二十八、Hudi 在 Lakehouse 中的位置

Lakehouse:

                +----------------+
                | BI / AI / SQL |
                +----------------+
                         |
            +------------------------+
            | Iceberg / Hudi / Delta |
            +------------------------+
                         |
             Object Storage / HDFS

Hudi 提供:

  • 表格式

  • 事务

  • 更新

  • 增量

能力。


二十九、Hudi 核心优势总结

优势说明
Upsert 强最大优势
CDC 强实时增量
Flink 友好Streaming 强
实时性强秒级
小文件治理完善
数据版本timeline
流批一体YES

三十、Hudi 的不足

问题说明
查询性能弱于 IcebergMOR merge 成本高
架构复杂timeline/log/compaction
运维复杂compaction 调优
文件管理复杂小文件问题严重时较难
大分析场景一般不如 Iceberg

三十一、什么时候选 Hudi

适合选 Hudi

如果你的场景:

高频更新
CDC
实时数仓
流式写入
增量消费

优先选 Hudi。


不适合

如果:

超大规模 OLAP
复杂分析
超高并发查询

更推荐:

  • Apache Iceberg

  • Delta Lake


三十二、未来趋势

当前趋势:

Hudi 越来越偏:

实时湖仓
CDC 平台
Streaming Lakehouse

尤其:

  • Flink CDC

  • 实时数据同步

  • AI Feature Store

  • 实时画像

领域。


三十三、企业使用案例

很多公司使用:

公司场景
Uber原始作者
ByteDance实时数仓
腾讯湖仓
阿里CDC
快手实时画像

三十四、总结

一句话总结:

Hudi 是“最像数据库”的数据湖表格式。

它最强的能力:

  • Upsert

  • CDC

  • Incremental Query

  • 实时流式写入

尤其适合:

Flink + Kafka + 实时数仓

架构。

而:

  • Apache Iceberg 更偏:

    • 大规模分析

    • 高性能查询

    • 云数仓

  • Delta Lake 更偏:

    • Spark/Databricks 生态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值