08. Hudi 客户端实现分析
主题说明
Hudi 提供了三种客户端实现:Spark、Flink 和 Java。理解客户端实现有助于理解不同引擎下的写入机制。
客户端实现包括:
- BaseHoodieWriteClient:客户端基类
- SparkRDDWriteClient:Spark 客户端
- HoodieFlinkWriteClient:Flink 客户端
- HoodieJavaWriteClient:Java 客户端
细化内容
BaseHoodieWriteClient - 客户端基类
BaseHoodieWriteClient是所有客户端的基类,定义了通用的写入逻辑。
主要方法:
startCommit():开始新的提交upsert():更新或插入insert():插入delete():删除commit():提交
核心逻辑:
- 索引查找
- 数据分区
- 文件写入
- 提交管理
SparkRDDWriteClient - Spark 客户端
SparkRDDWriteClient是 Spark 的客户端实现,使用 JavaRDD 作为数据容器。
特点:
- 使用 Spark 的分布式计算
- 支持大规模数据处理
- 自动管理 Spark 任务
HoodieFlinkWriteClient - Flink 客户端
HoodieFlinkWriteClient是 Flink 的客户端实现,支持流式写入。
特点:
- 支持流式写入
- Checkpoint 集成
- 状态管理
HoodieJavaWriteClient - Java 客户端
HoodieJavaWriteClient是 Java 的客户端实现,使用 List 作为数据容器。
特点:
- 单机处理
- 简单易用
- 适合小规模数据
关键技术
索引查找
所有客户端都使用索引来查找记录位置:
- Bloom Index:布隆过滤器索引
- Simple Index:简单索引
- Global Index:全局索引
数据分区
客户端根据分区字段对数据进行分区:
- 分区策略:按分区路径分区
- 文件组分配:分配文件组
- 写入优化:优化写入性能
提交管理
客户端管理提交过程:
- Instant 创建:创建提交时间点
- 元数据生成:生成提交元数据
- Timeline 更新:更新 Timeline
关键对象说明
类关系图
关键操作时序图
代码示例
Spark 客户端使用
HoodieSparkEngineContextcontext=newHoodieSparkEngineContext(jsc);HoodieWriteConfigconfig=HoodieWriteConfig.newBuilder().withPath(basePath).build();SparkRDDWriteClientclient=newSparkRDDWriteClient(context,config);StringinstantTime=client.startCommit();JavaRDD<WriteStatus>writeStatuses=client.upsert(records,instantTime);client.commit(instantTime,writeStatuses);总结
Hudi 提供了三种客户端实现,每种都有其适用场景。核心要点:
- BaseHoodieWriteClient是客户端基类
- SparkRDDWriteClient适用于 Spark 环境
- HoodieFlinkWriteClient适用于 Flink 流式写入
- HoodieJavaWriteClient适用于 Java 单机处理
- 索引查找是通用的核心逻辑
- 提交管理保证数据一致性
理解客户端实现有助于在不同场景下选择合适的客户端。