字节跳动基于Apache Hudi构建实时数据湖平台实践

本文涉及的产品
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
简介: 字节跳动基于Apache Hudi构建实时数据湖平台实践

一篇关于字节跳动基于 Apache Hudi 的实时数据平台的分享。


本篇内容包含四个部分,首先介绍一下 Hudi,其次介绍字节的实时数据湖平台的应用场景;然后针对应用场景,字节做的优化和新特性;最后介绍未来规划。

Hudi 是一个流式数据湖平台,提供 ACID 功能,支持实时消费增量数据、离线批量更新数据,并且可以通过 Spark、Flink、Presto 等计算引擎进行查询。

Hudi 表由 timeline 和 file group两大项构成。Timeline 由一个个 commit 构成,一次写入过程对应时间线中的一个 commit,记录本次写入修改的文件。

相较于传统数仓,Hudi 要求每条记录必须有唯一的主键,并且同分区内,相同主键只存在在一个 file group中。底层存储由多个 file group 构成,有其特定的 file ID。File group 内的文件分为 base file 和 log file, log file 记录对 base file 的修改,通过 compaction 合并成新的 base file,多个版本的 base file 会同时存在。

Hudi 表分为 COW 和 MOR两种类型,

COW 表适用于离线批量更新场景,对于更新数据,会先读取旧的 base file,然后合并更新数据,生成新的 base file。MOR 表适用于实时高频更新场景,更新数据会直接写入 log file 中,读时再进行合并。为了减少读放大的问题,会定期合并 log file 到 base file 中。

对于更新数据,Hudi 通过索引快速定位数据所属的 file group。目前 Hudi 已支持 Bloom Filter Index、Hbase index 以及 Bucket Index。其中 Bucket Index 尚未合并到主分支。

字节跳动基于 Hudi 的实时数据湖平台,通过秒级数据可见支持实时数仓。除了提供 Hudi 社区的所有功能外,还支持下述第三部分介绍的特性。

一个典型的 pipeline 是MySQL 侧的 binlog 生产到 Kafka。

实时场景直接通过 Spark Streaming 或 Flink 消费这部分更新数据,写入数据湖,供下游业务使用。批量场景会先将 binlog 通过 dump service 存储到 HDFS上,再按照小时/天级粒度更新到数据湖中。

在字节的推荐场景中,为服务离线对数据分析挖掘需求,需要将数据从类 Hbase的存储导出到离线存储中,并且可以提供高效的 OLAP 访问。因此我们基于数据湖构建BigTable 的 CDC。

此外,在特征工程和模型训练场景中,需要将推荐系统 Serving 时获得的数据和端上埋点数据这两类实时数据流通过主键合并到一起,作为机器学习样本。因此我们希望可以借助数据湖的能力,低成本的批量添加特征列。

数仓 backfill 场景中,需要对历史全量数据进行部分行、列的更新,在 Hive 模式下,需要将增量数据和历史全量进行 join,重新生成全量数据。其中,部分表的存量数据到达百 PB 级别。我们通过数据湖极大的减少了计算资源消耗,提升了端到端的性能。

数仓场景中,对于一张底层分析表,往往是通过多个数据源的数据组合拼接而成,每个数据源都包含相同的主键列,和其他不同的属性列。在传统数仓场景中,需要先将每个数据源数据 dump 成 Hive 表,然后再将多张 Hive 表按主键 join 后生成最终的完整 schema 的大表,延迟可到达天级别。我们通过数据湖使实时成为可能,并且提供列拼接能力,使下游数据分析性能大幅提升。

接下来介绍第三部分,针对上述场景,字节做的优化与新特性。

Hive Metastore 是元数据的事实标准,但是基于目录的元数据管理方式太粗,没有办法满足数据湖以 commit 的形式管理元数据的需求。我们提出了适用于数据湖场景下的元数据管理系统 Hudi Metastore,并基于此设计了湖仓统一的元数据管理系统。

整个架构分为三部分引擎层、元数据层、存储层。元数据层对外提供统一的元数据视图,与 HMS 完全兼容,可无缝对接多个计算引擎。元数据层的 Catalog Service 接收来自引擎层的访问请求,按规则路由到不同的 Metastore 上。元数据层通过 Catalog Service 屏蔽底层多 Metastore 的异构性。

Hudi Metastore 作为数据湖元数据管理系统,支持 commit 形式的元数据管理,基于乐观锁和 CAS 支持并发更新;持久化元数据的 Snapshot,通过缓存常被访问的元数据、索引信息,提供高效查询;提供分区裁剪功能。整体设计

底层存储可插拔,不依赖某个特定的存储系统,可以是 HDFS、KV、MySQL轻量且易于扩展,服务无状态,支持水平扩展;存储可通过拆库/表的方式纵向扩展与 Hive Metastore 兼容

我们基于 Hudi Metastore和乐观锁的假设,实现了并发写入,并且支持灵活的行列冲突检查策略。冲突检查会在 instant 状态变换的两个节点进行,一个是 requested 转 inflight 状态,一个是 inflight 转 completed 状态。其中,后者状态变换时,会进行加锁操作,以实现版本隔离。

冲突检查即是对 instant 创建到状态变化的过程中其他已经完成/正在执行的 instant 之间的进行冲突检查,检查策略分为行列两种,

行级别的冲突检查即是不能同时有两个 instant 往同一个 file group 写。列级别的冲突检查即是可以有两个 instant 往同一个 file group 写,但是两个 instant 写入的schema 不可以存在交集。每个 instant 只写入 schema 中的部分列,log 文件中的数据只包含 schema 中的部分Compaction 按主键拼接不同列下的数据,Parquet 文件中存储的数据拥有完整的 schema

Hudi 目前的两种索引方式,Bloom Filter Index 在大数据场景下,假阳性的问题会导致查询效率变差,而 Hbase Index 会引入额外的外部系统,从而提升运维代价。因此,我们希望能有一个轻量且高效的索引方式。

Bucket Index 是一种基于哈希的索引。每个分区被分成 N 个桶,每个桶对应一个 file group。对于更新数据,对更新数据的主键计算哈希,再对分桶数取模快速定位到 file group,提升导入实时性。

现有的计算引擎大都会利用表的 Bucket 分布做查询优化,提升查询性能。优化规则包含两种:

Bucket Pruning,利用表的 Bucket 分布对读取数据进行剪枝。Bucket Join,利用表的 Bucket 分布减少 Join/Aggregate 带来的 shuffle 操作。

Hudi 要求每条数据都有唯一主键和比较列,用于数据更新时定位 file group 和新旧数据比较。数据定位 file group 过程需要先根据索引构建主键到 file group 的映射关系,然后与更新数据按照主键进行 join,从而找到每条更新数据对应的 file group。

对于日志场景,无确定的主键,并且用户查询也仅仅是对某些列进行 count 操作,因此更新数据只需要直接追加到任一文件末尾即可,也就是 Append 模式。为此,我们提出了 NonIndex方案,无需指定主键和比较列,更新过程也无需构建主键到 file group 的映射关系,避免了 join,提升了导入的实时性。

后续我们会将新特性逐步贡献到社区。

相关实践学习
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
20天前
|
SQL 人工智能 数据挖掘
Apache Doris 4.0 AI 能力揭秘(二):为企业级应用而生的 AI 函数设计与实践
Apache Doris 4.0 原生集成 LLM 函数,将大语言模型能力深度融入 SQL 引擎,实现文本处理智能化与数据分析一体化。通过十大函数,支持智能客服、内容分析、金融风控等场景,提升实时决策效率。采用资源池化管理,保障数据一致性,降低传输开销,毫秒级完成 AI 分析。结合缓存复用、并行执行与权限控制,兼顾性能、成本与安全,推动数据库向 AI 原生演进。
136 0
Apache Doris 4.0 AI 能力揭秘(二):为企业级应用而生的 AI 函数设计与实践
|
28天前
|
消息中间件 监控 Java
Apache Kafka 分布式流处理平台技术详解与实践指南
本文档全面介绍 Apache Kafka 分布式流处理平台的核心概念、架构设计和实践应用。作为高吞吐量、低延迟的分布式消息系统,Kafka 已成为现代数据管道和流处理应用的事实标准。本文将深入探讨其生产者-消费者模型、主题分区机制、副本复制、流处理API等核心机制,帮助开发者构建可靠、可扩展的实时数据流处理系统。
222 4
|
2月前
|
SQL 存储 运维
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
本文介绍了 Apache Doris 在菜鸟的大规模落地的实践经验,菜鸟为什么选择 Doris,以及 Doris 如何在菜鸟从 0 开始,一步步的验证、落地,到如今上万核的规模,服务于各个业务线,Doris 已然成为菜鸟 OLAP 数据分析的最优选型。
183 2
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
|
7月前
|
存储 安全 数据挖掘
天翼云:Apache Doris + Iceberg 超大规模湖仓一体实践
天翼云基于 Apache Doris 成功落地项目已超 20 个,整体集群规模超 50 套,部署节点超 3000 个,存储容量超 15PB
374 2
天翼云:Apache Doris + Iceberg 超大规模湖仓一体实践
|
8月前
|
存储 分布式计算 大数据
基于阿里云大数据平台的实时数据湖构建与数据分析实战
在大数据时代,数据湖作为集中存储和处理海量数据的架构,成为企业数据管理的核心。阿里云提供包括MaxCompute、DataWorks、E-MapReduce等在内的完整大数据平台,支持从数据采集、存储、处理到分析的全流程。本文通过电商平台案例,展示如何基于阿里云构建实时数据湖,实现数据价值挖掘。平台优势包括全托管服务、高扩展性、丰富的生态集成和强大的数据分析工具。
|
7月前
|
存储 分布式数据库 Apache
小米基于 Apache Paimon 的流式湖仓实践
小米基于 Apache Paimon 的流式湖仓实践
178 0
小米基于 Apache Paimon 的流式湖仓实践
|
8月前
|
存储 分布式数据库 Apache
小米基于 Apache Paimon 的流式湖仓实践
本文整理自Flink Forward Asia 2024流式湖仓专场分享,由计算平台软件研发工程师钟宇江主讲。内容涵盖三部分:1)背景介绍,分析当前实时湖仓架构(如Flink + Talos + Iceberg)的痛点,包括高成本、复杂性和存储冗余;2)基于Paimon构建近实时数据湖仓,介绍其LSM存储结构及应用场景,如Partial-Update和Streaming Upsert,显著降低计算和存储成本,简化架构;3)未来展望,探讨Paimon在流计算中的进一步应用及自动化维护服务的建设。
419 0
小米基于 Apache Paimon 的流式湖仓实践
|
1月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
566 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
10月前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
704 33
The Past, Present and Future of Apache Flink

推荐镜像

更多
下一篇
oss教程