没有人会在工作清闲的时候翻开一本讲数据平台的书。
原因很简单:搭建数据平台不是胆小者的活儿。它往往意味着大量的定制开发与试验,需要你持续跟踪瞬息万变的开源生态,并在数月甚至数年的时间里反复打磨架构。没人会随随便便就踏上这样的旅程。
有趣的是,绝大多数人对自己组织里的数据平台浑然不觉。只有当事情严重出错时,它才会被拿到桌面上讨论。
我们假设你之所以阅读本书,是希望改进你所在组织的数据工作方式。也许客户已经开始抱怨数据陈旧或不一致;又或是支撑你们十年的遗留数据库在分析型查询负载或新增的机器学习功能面前不堪重负;再或者,你们的数据仓库在数据驱动型工作负载持续攀升的情况下,扩容成本变得高得离谱。
如果这些情境听起来耳熟,本书也许正是你所需要的。事实上,如果上述描述让你产生共鸣,很可能是因为你的组织需要一座“数据湖仓”(data lakehouse)——一种现代化的数据平台,不仅能解决这些挑战,还能在规模上释放更快的洞察、更先进的分析能力以及数据驱动的创新。
湖仓架构代表了在高效组织大规模数据的存储、处理与分析方面的最新范式。Apache Hudi 作为开源技术中的翘楚,能够让数据平台团队更容易地实现并运维这一架构范式。
在本章的开篇,我们将回顾数据管理架构的演进历程(包括 Hudi 在 Uber 的起源),为你的湖仓之旅做好准备。我们会概述 Hudi 的关键特性,剖析其架构栈,并探讨真实世界中的应用场景,为你理解本书后续内容打下坚实基础。
数据管理架构的演进
从最初的电子表格与原始文件格式,到如今的大规模分布式系统,通往湖仓的旅程,是在数据体量、种类与速度爆炸式增长时代中的一段技术演化史。
传统的关系型数据库首先登场,它们为事务优化,提供强一致性与结构化存储。然而,其面向行的架构最终难以胜任大规模的分析型查询,无法在规模上提供所需的性能。为解决这一问题,数据仓库应运而生:它们提供适合商业智能与分析的结构化查询与报表能力,但对非结构化与半结构化数据的支持有限,而且在大规模场景下成本高企。
数据湖架构的出现正是为了解决这些问题。它让组织能够利用如 Hadoop 分布式文件系统(HDFS)等高性价比的分布式文件系统,去存放海量的原始、异构数据,而无需在一开始就进行结构化或处理。这种灵活性为高级分析(如实时模型)与机器学习应用(如生成式 AI)奠定了基础,因为它们依赖庞大而多样的数据集。数据湖让你能够“全量留存”组织的数据,而不是只保留当下已知需要的那一小部分。
但即便把数据湖纳入你的平台,仍可能会遇到如下问题:
缺乏可变更性(mutability)
将湖中的数据与上游源系统保持同步很痛苦,尤其当你需要支持实时分析时更是如此。数据湖将数据视为“基本不可变”(即不支持事务或 upsert),因此天然偏向批量而非实时更新。可变更性的缺失会引入延迟,常常导致分析结果陈旧。
缺乏模式与结构
不同于数据仓库,用户可以通过表模式快速了解如何构造分析查询;数据湖的非结构化本性,常把数据变成下游用户眼中的“数据沼泽”,既不便也难以理解。
事务支持不足
缺乏事务能力与 ACID(原子性、一致性、隔离性、持久性)保障,数据就难以被信任。并发操作(例如一次突发的 ETL 作业)可能会与复杂的分析流程“打架”。系统故障发生时,你也可能无法恢复到正确的数据状态。
数据治理薄弱
数据湖并非开箱即用地提供治理与溯源能力。这意味着你需要自行实现策略与细粒度的访问控制,以防止数据泄露并确保不触犯合规红线。
数据湖仓的崛起
湖仓架构的出现,正是为了解决数据湖与传统数据仓库的局限:它将二者的核心优势融合为一体(见图 1-1)。通过兼具数据湖的可扩展性与灵活性,以及数据仓库在性能、可靠性与治理方面的能力,湖仓为数据管理提供了一种更加全面的途径。
湖仓架构(见图 1-2)建立在分布式文件系统(如 HDFS)或云存储系统(如 Amazon S3)之上。这个基础层作为主存储层,可容纳海量原始数据——无论是结构化、半结构化,还是非结构化数据。
在存储层之上,湖仓引入了事务层,这对增强数据管理能力至关重要。该层通常会定义文件格式(规定单个文件在磁盘上的数据组织与编码方式)与表格式(规定如何将一组数据文件作为“一张表”进行管理与呈现),并用于运行表级服务、支持事务等。事务层是将传统数据湖升级为湖仓的关键,它使得 ACID 事务、时间旅行查询(time travel)、变更数据捕获(CDC)、以及数据版本管理等高级能力成为可能。
这些能力是确保系统内数据可靠性与一致性的基础,同时也让查询引擎能够正确且高效地访问与处理数据。
尽管这种架构为早期采用者带来了显著收益,它也引入了更多复杂性。下一节所讲述的 Hudi 在 Uber 的孵化历程,正是一段在实时环境中驾驭这种复杂性,并从零打造高度定制的分布式数据系统、发挥其威力的故事。
Uber 的“事务型数据湖”难题
2016 年初,在高速增长期的推动下,Uber 从数据仓库架构向基于数据湖的架构转型。随着业务规模与复杂度的飙升,这一转变带来了诸多挑战,尤其是在不可变存储之上提供事务性保障方面需要创新。当时,“湖仓”(lakehouse)一词尚未进入行业词汇表。Uber 的工程师把他们的做法称为“事务型数据湖”(transactional data lake)——在数据湖之上增强类数据库功能。由于当时缺乏可用于生产的现成方案,Uber 不得不自行发明。
Uber 运营的核心在于“行程(trips)”数据(见图 1-3)。这些数据虽然在线上数据库中实时采集,但若要进行有意义的分析(而这正是 Uber 大量决策的基础),则需要进行大量离线分析处理。面对其庞大规模——每天约 120 TB!——最初的“行程”数据湖的局限很快暴露出来。
正如图 1-3 所示,在这种规模下的数据管理与处理已变得相当复杂。来自上游数据库的变更日志被摄入为原始表,并以 Apache Parquet 文件格式存储。每隔 8 小时,数据湖都会重新摄入整整 120 TB 的数据,尽管实际变更量不到 500 GB。这种低效还会在下游延续:构建在原始层之上的各条流水线同样每 8 小时就重算一遍全量数据,导致端到端的数据新鲜度大约只有 24 小时。考虑到一次行程平均仅 20 分钟,这样的滞后尤为致命。
这个平台不仅拖慢了分析与决策,还缺乏对故障恢复场景的有效控制。一旦某个摄入作业失败,就可能引发大范围的流水线中断,随后需要进行大量清理与重试。
工程团队聚到一起讨论应对之策。他们思考:
- 能否只消费“变更”,而不是每次都全量重算?如果可以,将会大幅减少每次摄入所需的数据量与计算资源。下游的各张表能否也这样做?
- 能否想出一种方法,让这些变更更快地“吸收”进各张表?复杂性并不止于最初的原始表,下游的派生表同样面临类似挑战。
- 在整个过程中,读者是否始终可以查询到一致的表快照,而不会暴露在部分写入或损坏的数据之下?
这些考量成为指导原则,并奠定了 Hudi 的核心原语与能力基础:
数据库抽象
在读写之间提供快照隔离。绝不向读者暴露进行中的写入或损坏的数据。
增量处理
只识别并处理自上次刷新以来发生变更的记录。全量重算不再是常态。
高效 upsert
通过索引与专门的并发控制机制,将变更记录应用到表中。
在这些能力的基础上,再配以后台表服务来维护与优化各张表,Hudi 逐步演化为一个面向 DFS 兼容存储、具备类数据库抽象的无服务器事务层。这一新架构(见图 1-4)带来了显著的运维收益:upsert 在不到 10 分钟内仅处理约 500 GB 的数据,把端到端延迟从 24 小时降至仅 1 小时。这些改进支撑了 Uber 内部不断增长的用例需求,推动 Hudi 项目快速演进。到 2016 年底,Hudi 已在 Uber 投入生产,最初版本就已包含 upsert、索引与变更流等关键特性。
意识到 Hudi 在 Uber 之外的更广阔潜力后,Uber 于 2017 年将该项目开源。此举让 Hudi 得以更广泛地被采用,获得多种查询引擎的支持,并扩展其对云环境的兼容性。2019 年,Uber 将 Hudi 捐赠给 Apache 软件基金会(ASF),并以 Apache License 2.0 许可证免费提供。此决定旨在促进创新与协作,并将 Hudi 打造成在大规模分布式环境中管理数据的标准化框架。2020 年,项目毕业成为 Apache 顶级项目。
自进入 ASF 以来,Hudi 的采用与发展都非常迅速。开源社区积极拥抱该项目,来自各行各业的工程师与数据科学家纷纷贡献代码。Hudi 在 ASF 下的首个正式版本发布于 2019 年 1 月,此后项目保持稳定的发布节奏,持续引入新特性、改进与修复。Hudi 先后加入了多写并发(multiwriter concurrency)、基于元数据的查询加速(metadata-driven query acceleration),并与 Apache Spark、Apache Flink、Apache Hive、Presto 以及云原生存储实现了深度集成。它的演进展示出“事务型数据湖”这一最初理念如何预示了后来业界所称的“湖仓”——一种将数仓的可靠性与性能与数据湖的规模与开放性相结合的统一架构。
如今,Hudi 作为领先的开源湖仓平台持续繁荣。它被 Uber、沃尔玛(Walmart)、快手与京东等组织广泛采用,以同时满足对实时新鲜度和大规模分析的多样化工作负载需求。随着 1.0 版本的发布,Hudi 进一步巩固了其作为完整数据湖仓管理系统(DLMS)的角色,在坚守最初愿景的同时,也在塑造数据平台的未来。
什么是 Hudi?
Hudi 是一个开放的数据湖仓平台,旨在解决不同行业中广泛的数据管理挑战。它将全球一些最大规模湖仓在高吞吐、异构数据高效处理方面的实战经验,融入到其多层架构之中,综合了数据湖、数据库与数据仓库的多种能力。
凭借其原生的高性能表格式,Hudi 为频繁变更(如更新或删除)的工作负载提供了强健方案。其索引机制与文件布局优化策略可显著简化数据操作,尤其适用于 CDC(变更数据捕获)场景与追求分钟级数据新鲜度的流式数据处理。借此,Hudi 能在同一份数据上同时统一批处理与流处理用例,为各类数据应用提供了一种高效替代实时数据集市的路径。
Hudi 还被设计为与其他开源与商业的数据类库、工具和系统高度兼容。正如图 1-5 所示,Hudi 能纳管来自多种数据存储系统的数据文件,包括 HDFS 以及诸如 Amazon S3、Google Cloud Storage(GCS)与 Azure Blob Storage 等云存储。Hudi 支持多种文件格式,包括 Parquet、Apache ORC 与 Apache Avro,并确保与 Apache Kafka 等事件流工具,以及主流 OLAP 引擎与数据仓库保持良好兼容。
Hudi 让数据平台工程师能够便捷地在湖仓架构中实现关键特性与应用语义,例如 ACID 事务、高效索引与高级表维护服务。其核心功能包括:
ACID 事务
Hudi 通过 ACID 事务确保数据一致性与完整性,避免传统数据湖中常见的部分写入或数据损坏等问题。开发者可以信赖数据的正确性,从而简化生产系统中的应用开发、调试与合规工作。
可变工作负载(Mutable workloads)
不同于多数仅对追加写(append-only)场景优化的表格式,Hudi 原生支持快速 upsert 与删除。借助可扩展的索引与高效的存储布局,Hudi 能处理包含流式数据、突发流量、乱序事件与去重的工作负载。你的湖仓因此更像一个数据库系统,而不仅是静态档案库。
灵活而强大的索引
Hudi 为所管理的数据维护丰富、可扩展的索引,加速写入并优化查询,尤其适用于大表与“宽表”;同时可按特定工作负载进行定制。相比仅依赖分区裁剪,这让大规模分析查询的效率大幅提升。
面向流的设计(Streaming-first)
Hudi 的初衷是弥合批处理与流处理之间的鸿沟,因此在管理流式数据方面具备独特能力。它原生处理事件时间(event-time)排序,即便数据乱序到达,也能确保表保持一致与准确——这在真实流水线中是日常现实。
可扩展的元数据,服务于超大规模数据集
Hudi 的元数据表采用带索引的存储格式来高效管理 PB 级数据,并维护诸如列统计等额外元数据,使查询规划的开销随“被查询的列数”而非“整表大小或文件数量”扩展。即使在超大或超宽数据集上,也能提供稳定可靠的性能,而传统的扁平文件方案在这方面常常乏力。
增量处理
通过仅捕获与处理数据变更,Hudi 显著降低处理时间与资源消耗,同时带来近实时的新鲜度。下游系统可直接消费 CDC 流,既支持流式也支持微批(microbatch)工作负载。
并发控制
Hudi 提供先进的并发控制机制,包括多版本并发控制(MVCC)与乐观并发控制(OCC),确保多个作业能够安全地向同一张表写入。它还支持创新性的非阻塞并发控制(NBCC),以避免在高吞吐(如流式)管道中的瓶颈,在保证更新可靠性的同时不牺牲摄入速度。
自动化表服务
Hudi 自动化执行聚类(clustering)、压缩合并(compaction)、清理(cleaning)、索引等表服务,确保你的表在读写两端都得到高度优化,并在存储效率上得到良好维护。支持多种部署模式以满足生产环境的灵活需求,包括自动调度与执行。
多云支持与广泛集成
Hudi 面向广泛生态而构建,已在主流云平台预装,并与 Spark、Flink、Hive、Presto、Trino 等领先引擎深度集成。它还提供从 Kafka 或 Debezium 的原生自动摄取工具,以及用于提升可发现性的自动目录同步(catalog sync)。在 Python、Rust 等多语言支持下,Hudi 能自然融入多样化的数据生态。
Hudi 技术栈
Hudi 通过将数仓与数据库的核心功能直接叠加到数据湖之上,把“文件集合”转变为“受良好管理的表系统”,从而实现数据湖仓架构。正如图 1-6 所示,Hudi 技术栈由五大组件组协同工作:
- 高性能表格式(High-performance table format)
- 存储引擎(Storage engine)
- 编程 API(Programming API)
- 用户访问(User access)
- 共享平台组件(Shared platform components)
本节余下内容将对这些组件组逐一做简要介绍。
原生表格式(Native Table Format)
Hudi 的表格式指的是 Hudi 表中数据的存储与组织方式(即文件存储机制与布局)。它负责跟踪表的模式(schema)、分区、文件以及表级统计信息。主要由三部分组成:
文件组与文件切片(File groups and file slices)
Hudi 将数据文件组织为称作“文件组”的逻辑单元,每个文件组由唯一的 file ID 标识。文件组进一步被划分为“文件切片”,可理解为不同版本。每个文件切片由一个基准文件(base file)和一组日志文件(log files)构成,用于表示该文件组在某一时间点的全量记录状态。
时间线(Timeline)
时间线是一个事件日志,按时间顺序记录表上发生的各类操作。它存放在表根路径下的 .hoodie 目录中,便于高效追踪与管理表的变更。
元数据表(Metadata table)
位于 .hoodie/metadata 的内部表,通过集中化的元数据操作提升读写性能。它支持多种元数据类型,包括分区与文件清单、列统计信息、记录级索引以及表达式索引等。
第 2 章与第 5 章将更详细地介绍这些概念。
可插拔表格式(Pluggable Table Format)
Hudi 通过可插拔的表格式层实现互操作性,既能读也能写 Apache Iceberg 与 Delta Lake 等格式。不同于仅提供读兼容的方案,Hudi 在支持多表格式的同时,仍保留其事务与性能优势。这种灵活性使组织能够遵循多样的生态标准,并与下游系统无缝集成。通过将存储引擎与表格式解耦,Hudi 面向不断演进的数据生态,定位为面向未来的多格式湖仓平台。
存储引擎(Storage Engine)
存储引擎组件把“数据库体验”(如 ACID 事务、高效 upsert 与删除、查询优化)带到数据湖中,并以高度优化与先进实现承载核心数据库功能。
索引(Indexes)
Hudi 实现了可扩展的索引层,使数据湖在写入(更新与删除)与查询两方面都真正高效。索引让 Hudi 在 upsert 与删除时能够快速定位记录,避免昂贵的全表扫描;同时还能让查询跳过无关文件,在超大规模下也能降低延迟、提升性能。可用索引包括:
- 记录索引(Record index)
- 桶索引(Bucket index)
- 简单索引(Simple index)
- Bloom 索引(Bloom index)
- 二级索引(Secondary index)
- 表达式索引(Expression index)
这些索引类型面向多样的数据模式与流量场景。选择合适的索引策略,能够让组织针对不同工作负载优化湖仓。第 5 章将深入讲解 Hudi 在写与读两侧的索引机制及其选型方法。
湖缓存(Lake cache,开发中)
湖缓存提供一个多租户缓存层,用于在写入速度与查询性能之间取得更优折中。它存储预合并(pre-merged)的文件切片,并利用 Hudi 的时间线管理缓存策略。不同于传统查询引擎的缓存,这一集成式缓存层可跨引擎共享,并支持更新与删除等事务性操作,实质上为数据湖提供了统一的缓冲池。
并发控制(Concurrency control)
Hudi 在写入进程、表服务与读者之间确保原子写入与快照隔离。主要采用三种并发控制机制:
- MVCC:在写入与表服务之间、以及不同表服务之间,以无锁、非阻塞方式实现。
- OCC:写入者之间采用带锁的乐观并发控制,在提交阶段解决冲突。
- NBCC:允许多个写入者同时对同一张表进行操作而不阻塞,避免无谓重试,保持流式管道的高吞吐与一致性——非常适合多流同时写入同一张表等高吞场景。
第 7 章将更详细地解析 Hudi 的并发模型。
表服务(Table services)
Hudi 内置的表服务用于执行维护与管理任务,确保表的平稳高效运行。表服务可在内联(inline)、异步(asynchronous)或离线(offline)模式下运行。关键表服务包括:
- 压缩合并(Compaction) :将基准文件与变更日志合并,生成更新后的基准文件,允许对同一文件组进行并发写入。
- 聚类(Clustering) :在湖存储中对相似数据分组与同置,利用数据局部性与更大的文件尺寸提升查询性能。
- 清理(Cleaning) :移除超出增量查询保留期的历史文件切片。
- 索引(Indexing) :构建并维护多种索引类型,通过减少从存储中扫描的数据量来加速查询与更新。
第 6 章将深入介绍如何通过这些表服务维护与优化 Hudi 表。
索引、湖缓存、并发控制与表服务协同工作,构成了 Hudi 技术栈中强健、高效、灵活的存储引擎,在湖仓环境下赋能先进的数据管理能力。
编程 API(Programming API)
编程 API 组件通过清晰定义的接口,向开发者开放 Hudi 的核心功能。作为较低层的集成点,它提供灵活性以应对复杂数据场景、实现自定义逻辑,并对写入与读取操作进行精细调优。由此,高阶用户可以将 Hudi 的能力扩展到标准功能之外,覆盖从批处理到实时分析的多样化用例。
写入(Writers)
Hudi 表不仅仅是简单的 Parquet/Avro 落地端,它通过 Spark、Flink 与 Java 应用同时支持增量操作(insert、upsert、delete)与批处理操作(insert_overwrite、delete_partition、bulk_insert)。关键特性包括:
基于操作的优化(Operation-based optimizations)
Hudi 针对不同操作进行专项优化:
- upsert 与 delete 结合索引查找按键合并;
- insert 跳过不必要步骤并保持高效;
- bulk_insert 提供多种排序模式以控制初始文件大小与文件数量。
这些能力让数据管道更快、更一致且更具可扩展性。
基于 MVCC 的批量写入(MVCC-based batch writes)
Hudi 采用多版本并发控制(MVCC)为典型的批量覆盖语义带来事务安全保障。借此,团队可在保持一致性与可靠性的前提下,自如地在常规运行的增量摄入与用于回填/删除旧分区的批处理作业之间切换。
以记录键为核心(Record keys at the core)
记录键(record key)在 Hudi 中是一等公民,可在跨分区或分区内保证记录唯一性。记录键广泛用于索引、合并、聚类、压缩合并(compaction)等,以一致地跟踪/控制记录在表内与跨文件的移动。除记录键外,Hudi 还保留记录级元数据,从而支持记录级变更流与增量查询。
可扩展的键生成器(Extensible key generators)
Hudi 提供内置与可定制的键生成器,用于定义唯一记录标识。键会物化在元数据中,从而带来更好的数据一致性与对更新应用方式的精细化控制。
合并模式(Merge modes)
用户可为常见合并语义配置合并模式,或为复杂冲突解决自定义合并策略。即使是复杂业务场景,也能在数据一致性与效率之间取得平衡。
第 3 章将深入讲解 Hudi 的写入能力。
读取(Readers)
即便在后台持续写入期间,Hudi 也通过快照隔离(snapshot isolation)保证一致、可靠的数据视图。依托记录级事件时间与提交时间戳的跟踪,Hudi 支持时间旅行查询(time travel)与增量查询(含 CDC),让分析师、数据科学家与业务用户总能使用最相关、最新鲜的数据——这对实时分析与持续演进的湖仓至关重要。
面向读取的编程 API 主要特性包括:
广泛的查询引擎兼容性(Broad query engine compatibility)
Hudi 与 Spark、Flink、Hive、Presto、Trino 等流行查询引擎无缝集成,组织可继续使用熟悉可靠的工具分析数据。
向量化与裁剪优化的读取性能(Optimized read performance with vectorized operations)
支持 Parquet 文件的向量化读取与基于列统计的扫描裁剪,显著加速读取,特别有利于大规模、高性能分析负载。
时间旅行(Time travel)
借助记录级事件与提交时间戳元数据,支持时间旅行查询,便于在历史快照上进行审计与调试。
增量查询(Incremental queries)
读取端可仅拉取指定时间窗口内发生变更的记录,降低仪表盘、机器学习管道与实时应用的延迟与开销。结合 CDC 模式,增量查询还能产出更丰富的变更洞察。
快照隔离(Snapshot isolation)
在并发写入下仍保证查询结果一致可靠,适用于批处理与流式湖仓环境。
第 4 章将详细介绍 Hudi 的读取能力。
用户访问(User Access)
Hudi 技术栈中的用户访问组件,充当其复杂数据管理能力与终端用户多样化需求之间的桥梁,使用户能在偏好的工具与语言中,充分利用湖仓特性。
SQL
Hudi 的通用性体现在对广泛 SQL 引擎的支持上,可灵活覆盖批处理与流处理工作负载。
大多数团队使用 Spark 结合 Hudi 进行批处理(分布式 ETL),同时 Hudi 与 Flink、Spark Structured Streaming 在实时与增量处理上也能无缝集成。Hudi 的一大核心能力是处理增量查询,允许用户仅处理自上次运行以来的变更。
Hudi 的查询接口对底层存储格式(如 Parquet)的复杂性进行了抽象,提供统一的访问层,使用户无需理解底层数据布局即可直接查询 Hudi 数据集。
因此,Hudi 能“到你的查询所在之处”与之对接:包括 Trino、Presto 在内的现代查询引擎均受支持,可对 Hudi 数据集进行快速、交互式、类 SQL 的查询,无需学习全新的查询语言。
此外,Hudi 与 ClickHouse、StarRocks 等高性能分析型数据库的结合,支持在大规模数据上的高速查询。配合对 ACID 事务、模式演进与基于索引/分区的查询优化的内建支持,Hudi 同时提供一致性与可扩展性,是动态环境下分析型工作负载的理想选择.
代码(Code)
Hudi 的代码级集成能力补足了其 SQL 能力。虽然 SQL 仍是数据工程的主流工具,但开发者与数据科学家常需要借助 Java、Scala、Python 等编程语言的完整表达力来实现复杂算法分析。Hudi 通过支持多种广泛使用的数据处理框架,满足用户在偏好语言中的工作需求。除对 Spark、Flink 等分布式框架的核心支持外,Hudi 也扩展到基于 Python 的分布式系统(如 Daft、Ray),并提供原生 Rust 绑定,便于与基于 C/C++ 的引擎无缝集成。
共享平台组件(Shared Platform Components)
Hudi 不只是一个表格式。它还自带一套丰富的内置工具,使数据管道与生产运维的管理更加顺畅。这些共享组件可以降低集成成本、简化流式处理,并为大规模运行 Hudi 表提供必要的护栏:
轻松的流式处理与数据摄入
Hudi 提供广受欢迎的摄入工具 Hudi Streamer,可持续从 Kafka、分布式文件系统(DFS)或其他流式源消费数据,应用变换,并写入 Hudi 表。它还与 Kafka Connect 与 Debezium 深度集成,使从上游数据库执行 CDC 并落地到 Hudi 变得简单易行、配置最小化,从而免去构建复杂的定制 CDC 管道的需求。
无缝的目录与元数据管理
Hudi 支持与 Hive Metastore、AWS Glue Data Catalog、DataHub 等目录自动同步,确保表可被主流引擎立刻查询,无需额外步骤。
完善的管理与监控
Hudi CLI 让用户能够控制表状态、运行表服务等。通过与 Prometheus、Datadog、Amazon CloudWatch 的指标集成,可实现稳健的监控,使工程师对摄入管道与表服务具备可观测性。
真实世界中的 Hudi(Hudi in the Real World)
随着越来越多的企业在数据洪流中挣扎,并被迫构建更稳健、可扩展且多才多艺的解决方案,许多人开始转向 Hudi 来解决数据管理难题。以下是跨不同行业的一些用例:
大规模数据分析与数据湖现代化
电信运营商每日用 Hudi 管理数十亿通话详单(CDR),通过数据聚类与清理优化存储,同时提升查询性能。广告科技公司处理海量用户交互数据以进行定向投放,借助 Hudi 的去重特性降低存储成本、增强分析效果。
增量处理与 CDC
在供应链管理中,全球零售商使用 Hudi 维持各门店的实时库存视图,尤其在高峰销售活动期间。Hudi 的增量处理能力显著减少处理时间与资源消耗,高效地将源系统的变更传播到湖仓平台。
合规、审计与数据治理
银行使用 Hudi 维护可审计的交易轨迹,可在任意时间点重现状态以支持调查与合规要求。为满足 GDPR 合规,组织利用 Hudi 的索引能力在大数据集中高效定位并删除特定用户数据。Hudi 的 ACID 事务 与 时间旅行 功能进一步支撑全面的数据治理实践。
近实时分析与流处理
电商平台使用 Hudi 处理点击流数据,实时更新商品推荐。能源公司用 Hudi 分析智能电表数据,实现对能耗的低延迟监控与快速异常检测。Hudi 的“湖仓可变更性(mutability)”能够在这些动态环境中高效应对突发流量与乱序事件。
数据驱动的个性化与欺诈检测
内容平台利用 Hudi 动态聚合与分析用户行为,支持近实时的个性化体验。金融服务公司借助 Hudi 进行欺诈检测,凭借对海量交易的近实时处理快速识别可疑活动。
机器学习、AI 与数据密集型研究
自动驾驶公司用 Hudi 管理用于 AI 模型训练的海量数据集,加速迭代并提升近实时决策的准确性。在基因组学与气候科学领域,研究人员借助 Hudi 高效处理 PB 级数据集,缩短分析时间并支持更频繁的模型更新。
支撑上述宽广用例谱系的关键,在于 Hudi 由多个核心组件组构成的复杂而精巧的架构。在第 8、9、10 章中,我们将探索更多真实案例,展示 Hudi 的创新特性如何直接转化为平台能力。
小结
本章我们回顾了通往湖仓的历程,其中包括 Uber 自身从数据仓库到数据湖、再到湖仓(具体来说是 Hudi)的复杂演进之旅。
我们阐明了“Hudi 是湖仓”的含义——即在数据湖之上扩展数据库与数据仓库的能力。随后简要浏览了 Hudi 的关键特性:大规模数据处理能力、对 ACID 事务的支持、高效的 upsert 与删除操作等;同时了解了 Hudi 在多个行业(电商、供应链、金融服务,当然还有网约车应用)中的典型用例。
我们介绍了 Hudi 的软件技术栈,包括其存储引擎组件、编程 API 组件、用户访问组件与共享平台组件,并了解到 Hudi 被设计为与常用的数据平台服务与查询引擎高度兼容。
有了这些基础,让我们在接下来的章节中更深入地探讨 Hudi 的能力与实现策略。