Hudi 的索引
Hudi 通过索引机制把 hoodie key (record key + 分区路径) 映射一个 file id 来提供高效的 Upsert 操作。record key 和数据文件的 group/file id 形成的映射关系从数据的第一个版本开始就不会改变了。简单来说,一条数据的所有版本都可以通过同一个 file id 找到。
对于 Copy-On-Write 的表来说,索引可以避免关联整张表来决定哪些文件需要重写,以加快 upsert/delete 的操作。
对于 Merge-On-Read 的表来说,索引可以限定 base 文件需要合并的数据条数,并且只需要对有更新的记录对应的 base 文件进行合并。
相反,如果没有索引机制的话(例如 Apache Hive ACID),需要所有的base 件合并 update/delete的数据,会造成很大的性能损失和资源占用。
黄色代表更新文件,白色代表 base 文件,图片来源于官网
Hudi 索引的类型
Hudi 当前支持的索引类型:
- Bloom 索引(默认):对 record key 创建布隆过滤器
- Simple 索引:对update/delete 操作和存储中提取出来的key,执行轻量级的 join
- HBase 索引 :通过外部的 HBase存储来管理索引
也可以通过扩展公开的 API 来实现个性化的索引。用户可以通过 hoodie.index.type 来配置索引的类型。
Global index 和 Non Global index
Global index(全局索引): Global index 要求保证 key 在表中所有分区的都是唯一的,保证一个给定的 record key 在表中只能找能唯一的一条数据。Global index 提供了强唯一性保证,但是随着表增大,update/delete 操作损失的性能越高,因此只适用于小表。
Non Global index(非全局索引):非全局索引只能保证数据在分区的唯一性。但是通过对 Hudi 索引的学习,不难了解到 key 与 file id 存在映射关系,同一个 key 的数据(包括 updete/delete)必然会存在同一个分区里面。这种实现方式提供更好的索引查找性能,适用于大表。
Bloom 索引 和 Simple 索引 支持 Global 和 Non Global 选项。
HBase 索引只支持 Global。