Hudi
Apache Hudi 核心特性
- 使用快速、可插入索引进行更新、删除
- 增量查询、记录级变更流
- 事务、回滚、并发控制
- 来自 Spark、Presto、Trino、Hive 等的 SQL 读/写
- 自动文件大小调整、数据聚类、压缩、清理
- 流摄取、内置 CDC 源和工具
- 用于可扩展存储访问的内置元数据跟踪
- 向后兼容的模式演变和执行
cow表
mor表
hudi 2022规划
发布 | 时间 |
0.11.0 | 2022 年 2 月 |
0.12.0 | 2022 年 4 月 |
1.0.0 | 2022 年夏季 |
Iceberg
Apache Iceberg 核心特性
- 通用化标准设计
- 完美解耦计算引擎
- Schema 标准化
- 开放的数据格式
- 支持 Java 和 Python
- 完善的 Table 语义
- Schema 定义与变更
- 灵活的 Partition 策略
- ACID 语义
- Snapshot 语义
- 丰富的数据管理
- 存储的流批统一
- 可扩展的 META 设计支持
- 批更新和 CDC
- 支持文件加密
- 性价比
- 计算下推设计
- 低成本的元数据管理
- 向量化计算
- 轻量级索引
Iceberg写数据
上图为 Iceberg 的写入跟读取的大致流程。
可以看到这里面分三层:
- 最上面黄色的是快照;
- 中间蓝色的是 Manifest;
- 最下面是文件。
每次写入都会产生一批文件,一个或多个 Manifest,还有快照。
比如第一次形成了快照 Snap-0,第二次形成快照 Snap-1,以此类推。但是在维护原数据的时候,都是增量一步一步做追加维护的。
这样的话可以帮助用户在一个统一的存储上做批量的数据分析,也可以基于存储之上去做快照之间的增量分析,这也是 Iceberg 在流跟批的读写上能够做到一些支持的原因。
iceberg 2022规划
github现状20220118采集
fork | start | 近一年发布版本次数 | 当前最新版本 | |
Apacheiceberg | 0.9k | 2.3k | 2 | 0.12.1 |
Apachehudi | 1.2k | 2.7k | 4 | 0.10.0 |
delta-io/delta | 0.9k | 4k | 3 | 1.1.0 |
对比环境
名称 | 版本 | 描述 |
flink | 1.13.1 | 开源版本 |
cdh | 6.3.2 | 开源版本 |
hive | 2.1.1-cdh6.3.0 | cdh6.3.0中版本 |
hadoop | 3.0.0-cdh6.3.0 | cdh6.3.0中版本 |
presto | 2.591 | 开源版本 |
trino | 360 | 开源版本 |
hudi | 0.10 | hudi-release-0.10.0 编译 |
Iceberg | 0.13 | master编译 |
版本支持
flink | spark | hive | impala | |
iceberg | 1.12.x,1.13.x,1.14.x | 4.0 | ||
hudi0.90 | 1.12.2 | !1.X | 3.4 | |
hudi0.10 | 1.13.x | 3.4 |
选型参考
功能可用 | 在规划中 | 没有规划且不可用 |
√ | ? | × |
功能对比
Cetegory | Items | Sub-items | dalta/dalta | 备注 | ApacheIceberg0.13 | 备注 | ApacheHudi0.10 | 备注 |
Basic | ACID | √ | √ | √ | ||||
TimeTravel | √ | √ | where查询或者通过参数控制 | √ | Trino可以回滚时间点 | |||
SchemaEvolution | √ | √ | api支持 | √× | sql未支持,其他方式未知 | |||
Source/Sink | Bath | √ | √ | √ | ||||
Streaming | √ | √ | V1支持,V2不支持 | √ | ||||
Mutation | SchemaEvolution | √ | √ | api支持 | √ | sql未支持,其他方式未知 | ||
PartitiomnEvolution | √ | √ | api支持 | √ | sql未支持,其他方式未知 | |||
Copy-on-writeUpdate | √ | √ | spark3.2 可以,但未合并 | √ | ||||
Merge-On-ReadUpdate | Read | × | √ | √ | ||||
Write | × | √ | √ | |||||
Compaction | × | ? | 可以手动定时合并小文件+清理过期快照 | √ | 资源消耗较高,推荐手动 | |||
AdvancedFeatures | Z-Ordering | × | ? | 预计0.14 | ?√ | 0.10已经支持 | ||
E2EEncryption | × | √ | 待验证 | × | ||||
SecondaryIndexes | × | ? | × | |||||
LocalSSDcashe | × | × | × | |||||
Autosmallfilesmerge | × | × | √ |
生态对比
Cetegory | Items | Sub-items | dalta/dalta | 备注 | ApacheIceberg | 备注 | ApacheHudi | 备注 |
Engines | ApacheSpark | Read | √ | √ | spark3操作icebergonhive2.1.1失败,类冲突,无法解决 | √ | ||
Write | √ | √ | √ | |||||
ApacheHive | Read | √ | √ | √ | 需要3.X才可以读取rt | |||
Write | ? | √ | 待验证 | × | 待验证 | |||
ApacheFlink | Read | ? | √ | √ | ||||
Write | ? | √ | √ | |||||
PrestoDB/Trino | Read | √ | √ | 不支持v2读取 | √ | |||
Write | ? | √ | 待验证 | × | 待验证 | |||
Impala | Read | × | √ | 4.0支持,待验证 | √ | 3.4版本支持cow读取 | ||
Write | × | × | × | |||||
Catalog | HiveCatalog | √ | √ | √ | ||||
AWSGlue | × | √ | 待验证 | ? | 待验证 | |||
AliyunDLF | × | √ | 待验证 | × | 待验证 | |||
IOVendor | AWSS3 | √ | √ | √ | ||||
AliyunOSS | √ | √ | √ | |||||
Languages | Java/Scala | √ | √ | √ | ||||
Python | √ | √ | √ | |||||
Rust | √ | × | × |
优缺点汇总
类别 | Hudi | Iceberg | Delte |
定义 | 大数据UPSERT问题,目标是近实时场景,和流计算结合较好 | 专注解决log数据的对象存储效率问题,目标是替换云上hive | 基于spark生态延伸 |
架构方面 | hudi架构方面做的不太好,和其他引擎结合需重构代码 | iceberg架构抽象比较高,和其他引擎结耦简单 | |
upsert | 读取或者压缩时,取最新的一条 | 先delete再insert,因此会有大量的delete file文件,然后读取时进行merge iceberg Row-level deletes的读实现是data file基于delete file在内存进行filter,看实现需要把delete file的记录都加载到内存,那如果delete的记录比较多的情况下,应该是会引起OOM | |
小文件 | 可以设置策略在线进行小文件合并,但在线消耗资源较高 | 定时触发离线任务合并小文件+清理过期快照 |
参考点
- 对 Append 的支持Iceberg 设计之初的主要支持方案,针对该场景做了很多优化。 Hudi 在 0.9 版本中对 Appned 模式进行了支持,目前在大部分场景下和 Iceberg 的差距不大, 目前的 0.10 版本中仍然在持续优化,与 Iceberg 的性能已经非常相近了。
- 对 Upsert 的支持Hudi 设计之初的主要支持方案,相对于 Iceberg 的设计,性能和文件数量上有非常明显的优 势,并且 Compaction 流程和逻辑全部都是高度抽象的接口。 Iceberg 对于 Upsert 的支持启动较晚,社区方案在性能、小文件等地方与 Hudi 还有比较明显 的差距。
- 社区活跃度Hudi 的社区相较于 Iceberg 社区明显更加活跃,得益于社区活跃,Hudi 对于功能的丰富程度与 Iceberg 拉开了一定的差距。