深入理解Apache Hudi异步索引机制
在我们之前的文章中,我们讨论了多模式索引的设计,这是一种用于Lakehouse架构的无服务器和高性能索引子系统,以提高查询和写入性能。在这篇博客中,我们讨论了构建如此强大的索引所需的机制,异步索引机制的设计,类似于 PostgreSQL 和 MySQL 等流行的数据库系统,它支持索引构建而不会阻塞写入。
背景
Apache Hudi 将事务和更新/删除/更改流添加到弹性云存储和开放文件格式之上的表中。 Hudi 内部的一个关键组件是事务数据库内核,它协调对 Hudi 表的读取和写入。索引是该内核的最新子系统。所有索引都存储在内部 Hudi Merge-On-Read (MOR) 表中,即元数据表在事务上与数据表保持同步,即使在出现故障时也是如此。元数据表也被构建为由 Hudi 的表服务自行管理,就像数据表一样。
动机
而Hudi目前支持三种索引;文件、column_stats 和bloom_filter,大数据的数量和种类使得添加更多索引以进一步降低I/O 成本和查询延迟势在必行。建立新索引的一种方法是停止所有写入程序,然后在元数据表内建立一个新的索引分区,然后恢复写入程序。随着我们添加更多索引,这可能并不理想,因为,a)它需要停机,b)它不会随着更多索引而扩展。因此,需要在与写入并发的表上动态添加和删除索引。异步索引有两个好处,改进写入延迟和解耦故障。对于那些熟悉数据库系统中的“CREATE INDEX”的人来说会了解创建索引是多么容易,而不用担心持续的写入。将异步索引添加到 Hudi 丰富的表服务集是尝试为 Lakehouse 带来类似数据库的易用性、可靠性和性能。
设计

与正在进行的写入进行异步索引的核心是确保这些写入可以对索引执行一致的更新,即使历史数据正在后台被索引。处理这个问题的一种方法是完全锁定索引分区,直到历史数据被索引然后赶上。然而,冲突的可能性只会随着长时间运行的事务的锁定而增加。这个问题的解决依赖于 Hudi 事务内核设计的三个支柱:
Hudi 文件布局
Hudi 表中的数据文件被组织成文件组,其中每个文件组包含多个文件切片。每个切片都包含一个在特定提交时生成的基本文件,以及一组包含对基本文件的更新的日志文件。这使得我们将在下一节中看到细粒度的并发控制成为可能。初始化文件组并写入基本文件后,另一个写入器可以记录对同一文件组的更新,并且将创建一个新切片。
混合并发控制
异步索引混合使用乐观并发控制和基于日志的并发控制模型。索引分为两个阶段:调度和执行。
在调度过程中,索引器(负责创建新索引的外部进程)获取一个短锁,并为数据文件生成一个索引计划,直到最后一个提交时刻 t。它初始化与请求的索引对应的元数据分区,并在此阶段完成后释放锁。这应该需要几秒钟,并且在此阶段不会写入任何索引文件。
在执行期间,索引器执行计划,将索引基础文件(对应于直到瞬间 t 的数据文件)写入元数据分区。同时,常规的正在进行的写入继续将更新记录到与元数据分区中的基本文件相同的文件组中的日志文件。编写基本文件后,索引器会检查 t 之后的所有已完成提交instant,以确保它们中的每一个都根据其索引计划添加条目,否则只是优雅地中止。这是当乐观并发控制启动时,使用元数据表锁来检查写入者是否影响了重叠文件,如果存在冲突,则中止,优雅中止确保可以以幂等方式重试索引。
Hudi时间线
Hudi 维护了在不同时刻在表上执行的所有操作的时间表。将其视为事件日志,作为进程间协调的核心部分。 Hudi 在时间轴上实现了细粒度的基于日志的并发协议。为了将索引与其他写入操作区分开来,我们在此时间线上引入了一个名为“索引”的新操作。此操作的状态转换由索引器处理。调度索引会在时间线中添加一个“indexing.requested” instant。执行阶段在执行计划时将其转换为“inflight”状态,然后在索引完成后最终转换为“completed”状态。索引器仅在向时间线添加事件时锁定,而不是在写入索引文件时锁定。
这种设计的优点如下:
- 数据写入和索引是分离的,但它们彼此了解。
- 它可以扩展到其他类型的索引。
- 它适用于批处理和流式工作负载。
使用时间线作为事件日志,两种并发模型的混合提供了出色的可扩展性和异步性,以便索引过程与写入器与其他表服务(如compaction和clustering)同时运行。
文档
有关索引器的设计和实现的更多详细信息,请查看 RFC-45。要设置并查看运行中的索引器,请遵循异步索引指南。
未来的工作
异步索引功能是 Lakehouse 架构中的首创,仍在不断发展。虽然可以与写入器同时创建索引,但删除索引需要表级锁定,因为表通常会被其他读取器/写入器线程使用。因此,一项工作是通过延迟删除索引并增加异步量来克服当前的限制,以便可以同时创建或删除多个索引。另一项工作是增强索引器的可用性;与 SQL 和其他类型的索引集成,例如二级键的Bloom索引,基于Lucene的二级索引(RFC-52)等。我们欢迎社区更多的想法和贡献。
结论
Hudi 的多模式索引和异步索引功能表明,事务数据湖不仅仅是表格格式和元数据。分布式存储系统的基本原理也适用于 Lakehouse 架构,并且挑战出现在不同的规模上。这种规模的异步索引很快就会成为必需品。我们讨论了一种可扩展到其他索引类型、可扩展和非阻塞的设计,并将继续在此框架的基础上为索引子系统添加更多功能。
深入理解Apache Hudi异步索引机制的更多相关文章
- 超级重磅!Apache Hudi多模索引对查询优化高达30倍
与许多其他事务数据系统一样,索引一直是 Apache Hudi 不可或缺的一部分,并且与普通表格式抽象不同. 在这篇博客中,我们讨论了我们如何重新构想索引并在 Apache Hudi 0.11.0 版 ...
- 一文彻底理解Apache Hudi的多版本清理服务
Apache Hudi提供了MVCC并发模型,保证写入端和读取端之间快照级别隔离.在本篇博客中我们将介绍如何配置来管理多个文件版本,此外还将讨论用户可使用的清理机制,以了解如何维护所需数量的旧文件版本 ...
- Apache Hudi异步Compaction方式汇总
本篇文章对执行异步Compaction的不同部署模型一探究竟. 1. Compaction 对于Merge-On-Read表,数据使用列式Parquet文件和行式Avro文件存储,更新被记录到增量文件 ...
- 一文彻底掌握Apache Hudi异步Clustering部署
1. 摘要 在之前的一篇博客中,我们介绍了Clustering(聚簇)的表服务来重新组织数据来提供更好的查询性能,而不用降低摄取速度,并且我们已经知道如何部署同步Clustering,本篇博客中,我们 ...
- Apache Hudi重磅特性解读之全局索引
1. 摘要 Hudi表允许多种类型操作,包括非常常用的upsert,当然为支持upsert,Hudi依赖索引机制来定位记录在哪些文件中. 当前,Hudi支持分区和非分区的数据集.分区数据集是将一组文件 ...
- Apache Hudi 设计与架构最强解读
感谢 Apache Hudi contributor:王祥虎 翻译&供稿. 欢迎关注微信公众号:ApacheHudi 本文将介绍Apache Hudi的基本概念.设计以及总体基础架构. 1.简 ...
- Apache Hudi又双叕被国内顶级云服务提供商集成了!
是的,最近国内云服务提供商腾讯云在其EMR-V2.2.0版本中优先集成了Hudi 0.5.1版本作为其云上的数据湖解决方案对外提供服务 Apache Hudi 在 HDFS 的数据集上提供了插入更新和 ...
- 数据湖框架选型很纠结?一文了解Apache Hudi核心优势
英文原文:https://hudi.apache.org/blog/hudi-indexing-mechanisms/ Apache Hudi使用索引来定位更删操作所在的文件组.对于Copy-On-W ...
- Apache Hudi重磅特性解读之存量表高效迁移机制
1. 摘要 随着Apache Hudi变得越来越流行,一个挑战就是用户如何将存量的历史表迁移到Apache Hudi,Apache Hudi维护了记录级别的元数据以便提供upserts和增量拉取的核心 ...
随机推荐
- 基于Ansible实现Apache Doris快速部署运维指南
Doris Ansible 使用指南 Apache Doris 介绍 Apache Doris是一个现代化的MPP分析型数据库产品.仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析.Apac ...
- 攻防世界-MISC:stegano
这是攻防世界新手练习区的第五题,题目如下: 点击附件1下载,得到一个pdf文件,打开后内容如下: 把pdf文件里的内容复制到记事本上,发现一串A和B的字符串,不知道是什么(真让人头大) 参考一下WP, ...
- 在C#中使用 SendMessage 实现操作外部其他程序上的控件教程
一.C#代码实现 本案例使用的是c# winform .NET Framework 4.7.2 首先我们声明一个寻找窗体的函数 [DllImport("User32.dll", E ...
- .NET LoongArch64 正式合并进入.NET
国内自主的龙芯,在做龙芯技术生态就把 .NET 作为其中一部分考虑进去,这也将对接下来国内.NET应用场景充满了期待.通过dotnet/runtime 可以知道现在龙芯版本的 .NET 已经合并到.N ...
- 【CSAPP】Shell Lab 实验笔记
shlab这节是要求写个支持任务(job)功能的简易shell,主要考察了linux信号机制的相关内容.难度上如果熟读了<CSAPP>的"异常控制流"一章,应该是可以不 ...
- swagger在线api文档搭建指南,用于线上合适么?
在上一篇文章中,我们讲解了什么是 api,什么是 sdk: https://www.cnblogs.com/tanshaoshenghao/p/16217608.html 今天将来到我们万丈高楼平地起 ...
- python 动态规划(背包问题和最长公共子串)
背包问题 现在要往一个可以装4个单位重量的背包里怎么装价值最高:A重量1个单位,价值15:B重量3个单位,价值20:C重量4个重量,价值30 使用动态规划填充空格 class SolutionBag: ...
- Linux下将一个文件压缩分包成多个小文件
压缩分包 将文件test分包压缩成10M 的文件: tar czf - test | split -b 10m - test.tar.gz 解压 将第一步分拆的多个包解压: cat test.tar. ...
- 详解TCP三次握手(建立TCP连接过程)
在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构. 这里只对涉及到三次握手过程的字段做解释 (1) 序号(Sequence number) 我们通过 TCP 协议将数 ...
- linux篇-linux 下建立多个tomcat
第一步:复制,解压 将准备好的tomcat压缩包复制到你准备安装的目录,我的tomcat压缩包名字是tomcat.tar.gz,我的安 装目录是 /usr/java/tomcat 第二步:解压tomc ...