一、概述

Hudi 借鉴了数据库设计的原理,提供了索引实现,通过索引机制加速数据的更新 ($Upsert、\ Delete、…$ ),将给定的 hoodie key (record key (记录键) + partition path ) 与文件 id(文件组)建立唯一映射。

这种映射关系,数据第一次写入文件后保持不变

二、设计

Hudi 为了加速数据的更新($Upsert、\ Delete、…$ ),支持多种索引,如分区级别的索引以及全表索引,分区级别的索引可以保证数据在分区内的唯一性,全表索引保证数据在表级的唯一性(开销较大)。

在有了索引之后,更新的数据可以快速被定位到对应的 FileGroup。上图为例,白色是基本文件,黄色是更新数据,有了索引机制,可以做到: 避免读取不需要的文件、避免更新不必要的文件、无需将更新数据与历史数据做分布式关联,只需要在 FileGroup 内做合并。

2.1. 全局索引 Global Index

全局索引在全表的所有分区范国下强制要求键的唯一性,也就是确保对给定的键有且只有一个对应的记录。全局索引提供了更强的保证,但是随着表增大,$Upsert/Delete$ 操作损失的性能越高,因此更适用于小表。

2.2. 非全局索引 Non-global Index

默认的索引实现,只能保证数据在分区的唯一性。Non-global Index 依靠写入器为同一个记录的 $Upsert/Delete$ 提供一致的分区路径,同时大幅提高了效率,更适用于大表。从 index 的维护成本和写入性能的角度考虑,维护一个 global index 的难度更大,对写入性能的影响也更大,所以需要 non-global index。

三、实现

Hudi 支持了多种类型的索引实现,典型的如 BLOOM、BUCKET 索引,以及自定义索引等方式。

HBase 索引本质上是一个全局索引,Bloom 和 Simple index 都有全局选项:

  • hoodie.index.type=GLOBAL_BLOOM
  • hoodie.index.type=GLOBAL_SIMPLE

3.1. HoodieIndex 接口