开源数据湖对比
Hudi的使用收益
Hudi内部机制
增量摄入与更新
- Hudi使用一种混合日志存储模式(称为Copy-on-Write),可以同时处理基础数据文件(Parquet)和增量日志(HoodieLogFile)。
- 以 MergeOnReadTable 的 upsert 操作为例,当有新数据到来时,Hudi会先将数据以行级别的增量形式高效地写入 HoodieLogFile,而不是直接更新基础文件。
- 相关代码可以参考 HoodieAppendHandle 的 makeNewBlock 方法,将 HoodieRecord 序列化为 HoodieLogBlock。
异步Compaction
- 为了避免日志量无限增大,Hudi会启动异步Compaction操作,定期将增量日志合并回基础文件。
- Compaction由Spark的map、reduce任务来并行执行,相关逻辑在HoodieRealtimeTableCompactor类中。
- 通过 scheduleCompaction 方法,Hudi根据日志大小等条件判断是否触发 Compaction,并通过Spark driver调度执行。
快照级别的一致性读
- Hudi会为数据文件生成定期快照,保证某个时间点的一致性读取。
- 当查询请求到来时,Hudi根据要求的时间点,将增量日志回放到对应的基础文件快照版本,对外提供统一的数据视图。
- 这部分由 HoodieTableFileSystemView 的 getLatestBaseFiles 等方法配合各个 FileSlice 来实现。
变更流支持
- Hudi原生支持将数据表的变更记录(HoodieRecord)直接流式发送到Kafka等消息队列。
- 下游的实时计算引擎可以直接消费这些变更事件,减少端到端延迟。
- 通过编写自定义的 Kafka 生产者代码,结合 Hudi 的数据处理机制,将
HoodieRecord
批量推送到 Kafka。
Global Index
- Hudi 支持在写入时指定 indexing 字段,会自动提取这些字段的值建立索引。
- 索引文件以 Hudi 表的形式单独存储,可以被高效查询,加速数据导出。
- 相关功能由 HoodieIndex 的实现类如 HBaseIndex, BloomIndex 等完成。
相关文档
Overview | Apache Hudi