查看原文
其他

Apache Hudi 从零到一:全面解读写入索引(四)

许世彦 DataFunSummit
2024-09-11

导读 本文介绍了 Apache Hudi 从零到一:全面解读写入索引(四)。本文翻译自原英文博客 https://blog.datumagic.com/p/apache-hudi-from-zero-to-one-410

主要内容包括以下几个部分:

1. 索引 API

2. 索引类型

3. 回顾

分享嘉宾|许世彦 Onehouse 开源项目负责人

编辑整理|马信宏

出品社区|DataFun


前一篇文章中,我们介绍了 Hudi 的写操作流程。在所有涉及的步骤中,索引是一个关键步骤,它验证表中记录的存在,并有助于实现高效的更新和删除操作。本篇文章将介绍索引 API 并探索各种类型的索引。请注意,本篇文章涵盖的索引是针对 writer 的,这与 reader 端的索引有所不同。

01

索引 API

写入索引抽象定义在 HoodieIndex 中。我将介绍一些关键的 API ,以提供对索引过程的大致理解。

  • tagLocation():当一组输入记录在写入过程中传递给索引组件时,会调用此 API来标记每条记录,确定它是否存在于表中,并将其与位置信息关联起来。标记后的记录称为“标记记录”。在 HoodieRecord 模型中,currentLocation 字段将通过这个标记过程来填充。

  • updateLocation():在写入存储之后,某些索引需要更新位置信息以与数据表同步。这一过程仅在 IO 后阶段为适用的索引类型执行。

  • isGlobal(): Hudi 将索引分类为全局和非全局类型。全局索引在所有表分区中标识唯一记录,因此相对于表是“全局”的。非全局索引则在分区级别验证唯一性。通常,非全局索引由于其扫描空间较小而表现更好,但它们不适用于记录可能在分区之间移动的表。

  • canIndexLogFiles():由于实现细节的不同,某些索引能够对 Merge-on-Read 表的日志文件进行索引。此特性影响了写入器创建文件写入句柄的方式:当对于配置的索引为真时,插入将通过 AppendHandle 路由到日志文件。

  • isImplicitWithStorage():这是一个特性,表示索引是否与存储上的数据文件一起隐式“持久化”。某些索引会将其索引数据单独存储。

02

索引类型

Hudi 提供了几种开箱即用的索引类型,以适应不同的流量模式和表大小。为每个表选择最合适的索引是一个关键的调优步骤。这篇博客(https://hudi.apache.org/blog/2020/11/11/hudi-indexing-mechanisms/)很好地解释了做出正确选择的重要性。在接下来的部分中,我将说明写入索引的内部工作原理,以增强理解。

1. 简单索引 (Simple Index)

简单索引是一种非全局索引,目前作为默认类型。其主要概念是扫描相关分区内的所有基础文件,以确定传入记录是否与任何提取的键匹配。

简单索引的标记流程

在左联接操作中,如果输入记录与提取的键匹配,连接结果将包含位置信息,然后用于填充 HoodieRecord 的 currentLocation 字段。这产生了所谓的“标记记录”。那些不匹配的记录将保持原样,并与标记记录合并进行进一步处理。

简单索引有一个全局版本,称为全局简单索引 (Global Simple Index) 。与其非全局版本不同,它将输入记录与所有分区的基础文件进行匹配,而不仅仅是相关的分区。当记录的分区值更新时,相应的文件组将被加载,这也包括用于MoR 表的日志文件,进行额外的标记步骤:它将传入记录与其现有的旧版本合并,并将合并结果标记到新分区中的位置。

由于简单索引倾向于在分区级别或表级别加载所有基础文件,因此它们非常适合具有随机或均匀分布数据访问的流量模式。

2. 布隆索引 (Bloom Index)

布隆索引的大致流程与简单索引类似。然而,布隆索引的区别在于它通过减少查找所需的键和文件数量,同时保持较低的读取成本。

布隆索引:过滤查找的键和文件

布隆索引采用了两阶段过滤以减少查找的键和文件数量:

  • 第一阶段涉及将输入键与使用基本文件(Base Files)页脚中存储的最小和最大记录键值构建的区间树进行比较。落在这些范围之外的键表示新的插入记录,而其余的键被视为下一阶段的候选对象。

  • 第二阶段将候选键与反序列化的 Bloom 过滤器进行检查,帮助确定确实不存在的键和可能存在的键。然后使用过滤后的键和关联的基本文件进行实际文件查找,随后返回用于标记的键和位置元组。

请注意,查找前的过滤过程仅涉及读取文件页脚,因此读取成本较低

与简单索引一样,布隆索引也有一个全局版本,称为全局 索索引(Global Bloom Index)。它的操作与非全局版本类似,但在表级别上运行,并采用与全局简单索引相同的逻辑来处理分区更新场景。

3. 桶索引 (Bucket Index)

桶索引基于哈希设计,使我们能够使用固定的哈希函数将键一致地映射到文件组,从而消除任何存储层读取的需要,显著地节省了索引时间。桶索引有两种变体——简单桶索引(Simple Bucket Index)和一致性哈希桶索引(Consistent-hashing Bucket Index)。简单桶索引分配固定数量的桶,每个桶映射到一个文件组,这限制了表中文件组的总数。这会导致在处理数据倾斜和横向扩展时的瓶颈。

一致性哈希桶索引旨在克服这些缺点:在相应的文件组超过某个大小阈值时,动态地将现有的桶重新哈希为子桶。

4. HBase 索引 (HBase Index)

HBase 索引通过一个外部运行的 HBase 服务器实现。它存储记录键与相关文件组信息之间的映射,并且是一个全局索引。这在大多数情况下为标记提供了高效的查找,并且随着表大小的增加可以轻松横向扩展。然而,缺点是造成了管理额外服务器的运维开销。

5. 记录级索引 (Record-Level Index)

引记级录索引是 0.14.0 版本中新增的功能,逻辑上类似于 HBase 索引:它也是一个全局索引,保存记录键和文件组的映射。关键改进在于将索引数据保存在 Hudi 表本地,从而避免了运维额外服务器的成本。详细讨论请参见这篇博客(https://hudi.apache.org/blog/2023/11/01/record-level-index/)

03

回顾

在本文中,我们讨论了 Hudi 的写入索引的 API,探讨了简单索引和布隆索引的详细流程,并简要介绍了桶索引、HBase 索引和记录级索引。欢迎关注 Hudi 公众号 ApacheHudi 获取微信群信息,加入钉钉群:35087066,发送空邮件至 dev-subscribe@hudi.apache.org 参与讨论。
以上就是本次分享的内容,谢谢大家。


分享嘉宾

INTRODUCTION


许世彦

Onehouse

开源项目负责人

Onehouse 创始团队成员,开源项目负责人。Apache Hudi PMC 成员。

活动推荐

往期推荐


Apache Spark SQL 原理

Data+LLM:数据治理新范式探索

多模态手机智能体 Mobile-Agent

大模型推荐系统:进展与未来

利用大语言模型促进综合图学习能力

开源框架 ModelScope-Agent 加速多智能体应用构建

数据治理在真实应用场景的落地探索!

大模型与图机器学习协同的用户行为风控

从RAG到Agent,就是大模型的全部了?

加速云端机器学习-Alluxio 在小红书的实践


点个在看你最好看

SPRING HAS ARRIVED

继续滑动看下一个
DataFunSummit
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存