Apache Hudi 在京东的最新架构演进
本文导读
本文详细介绍京东数据湖现状、最新自研技术特性、业务实践、社区贡献与未来规划,展示京东如何通过数据湖技术推动数据资产准实时化,提升数据资产的价值。 01
京东数据湖现状
京东数据湖团队近年一直在利用数据湖能力推进整个集团数据的准实时化,帮助京东零售、京东科技、京东物流等子集团的核心数据资产提升数据时效,入湖的数据规模已达到500PB以上,支撑这些的是强大的底层技术架构和平台产品能力。
最新自研技术特性
01. Hudi MoR LSM-Tree 在京东的业务实践中,随着数据规模的持续扩大与实时性要求的不断提升,Hudi MoR表在面对高并发、高吞吐的实时数据处理时,逐渐显现出多项性能与稳定性瓶颈,具体表现为: 1. 写入性能瓶颈 : 高流量数据写入时,MoR表执行更新需将增量数据与基础文件合并写回,难以兼顾低延迟与大吞吐量的并发写入,成为实时数据接入的关键制约。 2. 索引效率低下 : 当采用Bucket索引且分桶数量较多时,每次写入Log文件均需频繁执行耗时的List操作,严重影响写入性能。 3. 查询效率不足 : 底层使用的Avro行式存储格式无法有效下推查询,即使仅访问少数列也需读取整行数据,产生大量无效IO,导致查询效率低下。 4. 资源竞争与运维复杂 : 流式任务中写操作与Compaction共享资源,相互抢占常引发作业失败,往往需独立部署Compaction作业,增加了运维复杂性与成本。 5. 架构并发能力受限 : 缺乏并发更新能力,进行数据回溯或故障修复时必须暂停实时任务,影响业务连续性;同时受表级并发写入能力限制,同一张表的多个加工任务只能串行执行,导致数据产出延迟累积,难以满足高时效性要求。 为应对京东实时数据业务,特别是流量洪峰下的实时数仓、多流融合等场景对性能、稳定性与并发处理能力提出的更高要求,京东数据湖团队基于LSM-Tree思想对Hudi进行架构升级,旨在突破现有瓶颈,更高效地支撑日益增长的实时数据业务需求。 基本设计原则 LSM-Tree是一种通过顺序写入和分层合并来优化读写性能的存储结构。在Hudi底层改造中, 以Bucket索引为基础,将每个FileGroup内的文件组织成一棵两层LSM-Tree。新写入的数据首先进入L0层,通过两类合并(Compaction)机制提升查询效率、减轻读时合并压力:
-
Minor Compaction
:
用于将L0层的小文件合并为更大的L0文件,高效控制小文件数量,执行频率高且速度快。
- Major Compaction : 周期性将所有文件合并至唯一的L1层文件中,从而在保持数据全局一致性的同时,降低合并操作的执行频率。
- 避免重复调整 : 当识别到相同主键时,可直接基于索引复用比较过的路径,无需重新遍历树结构。
- 批量合并输出 : 在一次调整中,可定位并输出当前树中所有相同主键的记录,支持合并函数一次性完成聚合。
- 消除深拷贝 : 通过索引直接引用数据位置,无需进行对象复制,大幅降低内存与CPU开销。
- 实时:使用Flink流式Join,海量数据场景下状态存储巨大,维护成本高、运维复杂
- 离线:定期执行Spark Join,数据时效退化为调度周期+执行时间
- SKU 数据流实时更新维护外键索引,并 Partial Update 下发到 Hudi 商品宽表
- SPU 数据流实时查询外键索引,获取所有相关主键,展开后 Partial Update 下发到 Hudi 商品宽表
- 最终满足业务分钟级时效
- 基于 NativeIO SDK 读取 Parquet 文件,相较于 Spark 向量化读取 Parquet 文件,性能提升约 2 倍。
- 该性能优化有效解决 AI 场景下样本引擎在数据读取环节的关键瓶颈,从而显著提升了整体处理时效。
业务实践
流量数仓ADM数据湖升级 流量业务当前存在实时、离线两套开发链路,存在运维和开发成本高,口径不一致等问题; 离线链路各场域基于埋点数据自行加工存在口径不一致和数据存储冗余等问题;同时当前不具备满足准实时数据场景。流量业务存在如数据倾斜严重、数据规模超大、并发修数等挑战,基于数据湖Hudi建设统一流量公共层准实时链路,实时链路统一口径加工将实时数据入湖,提供准实时数据分析能力,在链路升级过程中做了大量的内核优化。
- 自研基于TimelineService的Remote Partitioner功能,采用集中式分区+桶分配策略,解决桶分配倾斜
- 自研分区级分桶,按照业务分区数据特性自定义分区桶数,并实现原地桶扩缩容
- 自研LSM-Tree数据组织格式,基于LSM顺序读写及分层合并的核心优势,提升MoR读、写、合并性能;
- 基于LSM-Tree文件隔离机制,解决元数据冲突、 JM与TM通信冲突、以及Hive元数据同步的冲突,实现轻量级的无锁并发Upsert
- 自研Hudi外键索引 + Partial Update,实现SKU维度信息变更时的主键回刷,保持同一个分区内SKU信息数据的一致性
社区贡献及未来规划
社区贡献 目前京东Hudi团队累计向社区贡献109个PR,其中包含一些重要的工作,例如RFC-83 Incremental Table Service、RFC-89 Partition Level Bucket Index、HUDI-6212 Hudi Spark 3.0.x integration等,充分体现了团队在 Hudi 项目中的重要作用及持续贡献能力。目前团队包含一名Hudi PMC,一名Hudi Committer,Hudi前100名源码贡献者中团队占6人, 发展成为 Hudi社区的重要力量之一。 未来规划
- 基于社区最新版本,推进JD内部Hudi版本演进
- 数据湖支持多模态能力,支持非结构化数据存储以及向量索引等能力支撑 AI 场景
- 基于Rust+Arrow推进NativeIO能力
- 探索湖流一体技术方案