Apache Kudu 在存储架构上是怎样组织的?它依赖哪些机制来同时保证数据写入与读取的高性能?
考察说明
考查对 Kudu 列式存储架构及其读写优化机制的理解。
回答思路
- 【回答框架 1】Kudu 采用列式存储与行式主键索引结合的架构,数据按表分区,每个分区由多个 Tablet 组成,Tablet 内数据分为 MemRowSet 和 DiskRowSet 两类存储。MemRowSet 为内存中的可变行存储,用于承接新写入;DiskRowSet 为落盘的不可变列式存储,按主键有序。
- 【回答框架 2】写入路径上,新数据先写入 MemRowSet,达到阈值后 Flush 为 DiskRowSet,并在后台执行 Compaction 合并小文件并清理重复数据。为支持高效主键更新与删除,Kudu 采用类似 LSM 的思路,在 DiskRowSet 中维护 Redo Undo 记录,插入时通过主键索引定位,更新删除则追加记录,避免原地修改。
- 【回答框架 3】读取路径上,Kudu 利用列式存储按需读取列,减少 IO;同时通过主键索引和分区裁剪快速定位所需数据。Scan 时结合 MemRowSet 与多个 DiskRowSet 的合并视图,利用 Undo 记录实现快照隔离,保证一致性读取。Compaction 不仅优化存储,也提升读取性能。
- 【回答框架 4】为兼顾随机读与批量扫描,Kudu 在 DiskRowSet 中维护 Bloom Filter 和主键索引,快速排除不存在的键;同时列式编码如字典、压缩等技术减少存储与 IO。相比于纯列存系统,Kudu 通过行式主键索引支持高效的点查和更新,相比纯行存系统则提供更好的分析查询性能。
- 【回答框架 5】Kudu 的架构设计以支持混合工作负载为目标,通过内存与磁盘分层、列式编码、主键索引及后台 Compaction,实现了写入与读取性能的平衡。实际调优需关注 Tablet 数量、分区方式、内存大小及 Compaction 策略等参数。
- 【关键点 1】Kudu 采用列式存储与主键索引结合的架构,数据分 Tablet 管理。
- 【关键点 2】新写入先进 MemRowSet,达到阈值后 Flush 为 DiskRowSet,Compaction 合并优化。
- 【关键点 3】更新删除通过 Redo Undo 记录实现,不原地修改,支持快照隔离读取。
- 【关键点 4】读取时列式按需读取,结合分区裁剪、Bloom Filter 和主键索引提升效率。
- 【关键点 5】架构目标是同时支持高效随机读写与批量分析扫描。
- 【易错点 1】不要将 Kudu 说成纯列存数据库,它结合了行式主键索引。
- 【易错点 2】不要忽略 Compaction 对读写性能的影响,过多小文件会拖慢读取。
- 【易错点 3】Kudu 并非所有场景都优于 HBase 或 Parquet,混合负载才最能体现优势。