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

本文涉及的产品
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
云原生数据仓库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,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
10天前
|
存储 数据挖掘 数据处理
【破晓数据湖新时代!】巴别时代揭秘:Apache Paimon 打造 Streaming Lakehouse 的神奇之旅!
【8月更文挑战第9天】随着数据湖技术的发展,企业积极探索优化数据处理的新途径。Apache Paimon 作为一款高性能数据湖框架,支持流式与批处理,适用于实时数据分析。本文分享巴别时代使用 Paimon 构建 Streaming Lakehouse 的实践经验。Paimon 统一了数据存储与查询方式,对构建实时数据管道极具价值。
32 3
|
22天前
|
存储 搜索推荐 数据建模
阿里巴巴大数据实践之数据建模:构建企业级数据湖
阿里巴巴通过构建高效的数据湖和实施先进的数据建模策略,实现了数据驱动的业务增长。这些实践不仅提升了内部运营效率,也为客户提供了更好的服务体验。随着数据量的不断增长和技术的不断创新,阿里巴巴将持续优化其数据建模方法,以适应未来的变化和发展。
|
2月前
|
存储 分布式计算 OLAP
Apache Paimon统一大数据湖存储底座
Apache Paimon,始于Flink Table Store,发展为独立的Apache顶级项目,专注流式数据湖存储。它提供统一存储底座,支持流、批、OLAP,优化了CDC入湖、流式链路构建和极速OLAP查询。Paimon社区快速增长,集成Flink、Spark等计算引擎,阿里巴巴在内部广泛应用,旨在打造统一湖存储,打通Serverless Flink、MaxCompute等,欢迎大家扫码参与体验阿里云上的 Flink+Paimon 的流批一体服务。
13749 7
Apache Paimon统一大数据湖存储底座
|
3月前
|
OLAP 数据处理 Apache
众安保险 CDP 平台:借助阿里云数据库 SelectDB 版内核 Apache Doris 打破数据孤岛,人群圈选提速4倍
众安保险在CDP(Customer Data Platform,客户数据平台)建设中,通过引入阿里云数据库SelectDB版内核Apache Doris,成功打破了数据孤岛,并显著提升了人群圈选的速度
227 1
|
3月前
|
存储 分布式计算 Apache
官宣|Apache Paimon 毕业成为顶级项目,数据湖步入实时新篇章!
Apache Paimon 在构建实时数据湖与流批处理技术领域取得了重大突破,数据湖步入实时新篇章!
2822 6
官宣|Apache Paimon 毕业成为顶级项目,数据湖步入实时新篇章!
|
3月前
|
存储 缓存 监控
Java一分钟之-Apache Ignite:分布式内存计算平台
【5月更文挑战第21天】Apache Ignite是一款开源的分布式内存计算平台,涉及内存数据网格、流处理和计算服务。本文关注其常见问题,如数据丢失、分区不均、内存管理和网络延迟。为保证数据一致性,建议使用适当的數據模式和备份策略,实现数据持久化。优化内存配置和监控网络可提升性能与稳定性。提供的Java代码示例展示了如何创建分区缓存并设置备份。正确配置和管理Ignite是构建高可用、高性能应用的关键,持续监控集群状态至关重要。
96 0
|
3月前
|
存储 人工智能 运维
数据湖建设实践:使用AWS S3与LakeFormation构建灵活数据存储
【4月更文挑战第8天】本文分享了使用AWS S3和LakeFormation构建数据湖的经验。选择S3作为数据湖存储,因其无限容量、高可用性和持久性,以及与多种系统的兼容性。LakeFormation则负责数据治理和权限管理,包括元数据管理、简化数据接入、细粒度权限控制和审计。通过这种方式,团队实现了敏捷开发、成本效益和数据安全。未来,数据湖将融合更多智能化元素,如AI和ML,以提升效能和体验。此实践为数据驱动决策和企业数字化转型提供了有力支持。
209 2
|
3月前
|
分布式计算 资源调度 Hadoop
Apache Hadoop入门指南:搭建分布式大数据处理平台
【4月更文挑战第6天】本文介绍了Apache Hadoop在大数据处理中的关键作用,并引导初学者了解Hadoop的基本概念、核心组件(HDFS、YARN、MapReduce)及如何搭建分布式环境。通过配置Hadoop、格式化HDFS、启动服务和验证环境,学习者可掌握基本操作。此外,文章还提及了开发MapReduce程序、学习Hadoop生态系统和性能调优的重要性,旨在为读者提供Hadoop入门指导,助其踏入大数据处理的旅程。
791 0
|
3月前
|
消息中间件 监控 Kafka
Yotpo构建零延迟数据湖实践
Yotpo构建零延迟数据湖实践
108 0
|
17天前
|
SQL API Apache
官宣|Apache Flink 1.20 发布公告
Apache Flink 1.20.0 已发布,这是迈向 Flink 2.0 的最后一个小版本,后者预计年底发布。此版本包含多项改进和新功能,涉及 13 个 FLIPs 和 300 多个问题解决。亮点包括引入物化表简化 ETL 管道开发,统一检查点文件合并机制减轻文件系统压力,以及 SQL 语法增强如支持 `DISTRIBUTED BY` 语句。此外,还进行了大量的配置项清理工作,为 Flink 2.0 铺平道路。这一版本得益于 142 位贡献者的共同努力,其中包括来自中国多家知名企业的开发者。
591 7
官宣|Apache Flink 1.20 发布公告

推荐镜像

更多