Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >字节跳动基于 Apache Hudi 的湖仓一体方案及应用实践

字节跳动基于 Apache Hudi 的湖仓一体方案及应用实践

作者头像
ApacheHudi
发布于 2023-09-04 04:43:30
发布于 2023-09-04 04:43:30
2K0
举报
文章被收录于专栏:ApacheHudiApacheHudi
本文对目前主流数仓架构及数据湖方案的不足之处进行分析,介绍了字节内部基于实时/离线数据存储问题提出的的湖仓一体方案的设计思路,并分享该方案在实际业务场景中的应用情况。最后还会为大家分享 LAS 团队对湖仓一体架构的未来规划。

/ 主流数仓架构 /

目前主流的数仓架构—— Lambda 架构,能够通过实时和离线两套链路、两套代码同时兼容实时数据与离线数据,做到通过批处理提供全面及准确的数据、通过流处理提供低延迟的数据,达到平衡延迟、吞吐量和容错性的目的。在实际应用中,为满足下游的即席查询,批处理和流处理的结果会进行合并。

Lambda 架构的优势集中体现在职责边界明确、高容错性与复杂性隔离上,主要包含以下三方面:

职责边界清晰:流处理专注于增量数据计算,批处理专注于全量数据计算;

容错性:批处理 T+1 全量计算的结果会覆盖流处理的结果,意味着流处理假如有异常、可以被批处理计算时修复;

支持复杂性隔离:批处理的是离线就绪数据,可以很好的掌控。流处理采用增量方式处理实时数据,复杂性要高很多。通过分开批处理和流处理两套链路,把复杂性隔离到流处理,可以很好的提高整个系统的鲁棒性和可靠性。

具有上述优点的同时,Lambda 架构同样存在一系列尚待优化的问题,涉及到计算、运维、成本等方面

实时与批量计算结果不一致引起的数据口径对齐问题:由于批量和实时计算走的是两个计算框架和计算程序,计算结果往往不同,经常出现一个数字当天查看的数据与第二天的不同,数据校准困难;

开发和维护的复杂性问题:Lambda 架构需要在两个不同的 API 中对同样的业务逻辑进行两次编程:一次为批量计算,一次为流式计算。针对同一个业务问题产生了两套代码,形成了双倍的维护运维成本;

资源成本问题:两套链路的存储介质不同、计算引擎也不同,会造成数据存储和资源翻倍。

综上所述,主流数仓架构本质上有两个痛点:实时/离线计算层不统一;实时/离线存储层不统一。本文将聚焦于实时/离线存储层统一的实现能力上,希望能够有一套同时支撑实时场景下的增量处理和离线场景下的高效分析存储方案。

/ 数据湖方案 /

Hudi 作为数据湖框架的一种开源实现,其核心特性能够满足对于实时/离线存储层统一的诉求:

支持实时消费增量数据:提供 Streaming Source/Sink 能力,数据分钟级可见可查;

支持离线批量更新数据:保留原有 Hive 的 Insert 和 Overwrite 能力,并且提供对历史数据的更新删除能力 Upsert/Update/Delete;

Spark、Flink、Presto 等计算引擎集成比较好。

尽管 Hudi 解决方案已经能够实现一份存储同时包含实时和离线两种场景,但由于数据的分钟级可见,它依然存在一定的优化空间,无法作为实时数仓存储的标准方案。

/ 湖仓一体诉求 /

批流统一的湖仓一体存储需要满足更多的诉求,相匹配的就需要具备更强硬的核心能力,包括批式/流式读写能力与支持多种引擎的集成能力:批式读写提供不低于 Hive 表的吞吐,提供分区并发更新能力;流式读写能够端到端处理秒级低延迟,具备千万级 RPS 写入和消费能力,提供 ExactlyOnce 和 At Least Once 消费语义;支持多种引擎的集成能力,实现查询引擎集成化。

我们针对以上需求,提出了更加高效的湖仓一体服务方案。接下来将从整体架构、数据分布、数据模型、数据读写以及 BTS 架构这 5 个方面,向大家介绍该方案的设计思路。

/ 整体架构 /

为解决实时性问题,字节内部在数据湖上自研了基于内存的服务,形成了一套高吞吐、高并发、秒级延迟可见的实时数据湖方案。整体架构如下:

架构底层为数据持久化层。复用 Hudi 的能力实现数据存储。文件分布和 Hudi 一致,通过列存的 base 文件与行存的 log 文件进行数据存储,基于时间戳维护数据版本。通过 filegroup 的方式对文件进行分组,相同逐渐的数据存储在同一个文件组内。后期结合数据构建索引能力,能够比较大幅度提升数据入湖和查询的性能。

架构的第二层是元数据层。对数据湖的元数据进行管理,包括表、分区以及 instant、timeline、snapshot 等这些数据湖特有的元数据。在这一层不光实现了元数据的管理,还能够解决多并发写入的冲突检查和解决,保障 ACID 能力

架构的第三层是服务层。主要包含两个组件:BTS 和 TMS。BTS 是基于内存构建的服务层,通过内存加速数据读写操作,解决实时场景下数据生产消费的时效性问题。TMS 是聚焦在表优化的服务,会异步做一些 log 文件和 base 文件的compaction/小文件合并优化等操作。

/ 数据分布 /

基于上述湖仓一体存储架构,新增了中间的实时加速服务层,数据的物理分布整体采用 Hudi 的结构,如下图所示:

针对图中的分布情况,为了方便大家进一步的理解,图中涉及到的各部分含义如下:

Table:对应一张 Hudi 表;

Partition:可以按照指定字段进行分区,对应的是一个 Storage 的目录(类似 Hive 分区的概念);

FileGroup:也是 Hudi 的一个概念,可以理解为一个文件组,这个文件组中包含列存的 base file 和行存的 log file,主键表中相同主键的数据会被分配到同一个 File Group 中;

Block:Table Server 中的一块内存空间。对于主键表,会按照主键基于时间戳做排序后合并 Flush 成 Hudi 的 log file;对于非主键表,会按照 offset 有序进行 Flush;

WAL Log:Block 对应的持久化存储,在 Block 遭驱逐后可用作流式回溯;

计算引擎中 Task 和 Block 是一对多的关系。

以上便是数据的物理分布情况,基于上述分布信息,我们接下来介绍数据模型的基本情况。

/ 数据模型 /

对于一张流批一体表,需要有两个视图,增量视图和快照视图:

增量视图对应的是一张 Append Only、记录数据完整变化明细的表,用于实时增量计算。无主键表时,按照 CommitId+Offset 有序;有主键表时,按照 CommitId+Offset 有序,同一个 Key 可能会存在多条数据;

快照视图对应的是一张给予时间动态变化的快照表,用于离线批量计算。无主键表时,按照 CommitId+Offset 有序,与增量视图等价;有主键表时,分区内 Key 是唯一的,只保存最新的数据;

基于增量试图可以计算出快照视图。快照视图中数据已经基于主键做了合并,因此无法复现出增量视图。

/ 数据读写 /

我们首先会基于流批的特性针对流批读写做负载分离。其中流作业延时敏感,吞吐稳定,通过 BTS 加速;批作业用于批量计算,注重吞吐,延迟不敏感,直接与底层文件存储交互。

在流批负载分离的前提下,会做数据准确性保障。流批并发,写入时保障数据一致性;批数据写入时互不阻塞,同时保障流作业的低延迟和批作业的成功率。

/ BTS 架构 /

BTS 架构主要分为 BTS Master 与 BTS Table Server 两部分:

BTS Master 由三部分组成。Block Load Balancer 为 Client 分配 Block,负责 Block 级别的负载均衡;Block Metadata Manager 负责管理 Block 与 TableServer 的关系元信息;Transation Manager 负责创建和提交分布式事务。

BTS Table Server 由五部分组成。Session Manager 负责维护客户端的会话和配置信息,比如读写的 Offset 信息;DataService 提供数据读写 RPC 接口,提供列裁剪、谓词下推查询接口;Transaction Manager 提PreCommit 信息,如插入行数、Block 节点信息、Start-End Offset 信息等;MemStore 内含多表共用的内存区,管理内存分配和清理,管理Block生命周期。具备提供内存中快速查找、列裁剪、过滤、排序等能力;WAL 能够实现内存数据持久化,用于异常恢复。此外,在写缓存遭驱逐时,可用于数据读取。

湖仓一体存储在不同场景下应用时展现出了不同的亮点,下面我们介绍三个经典场景:流式数据计算、实时多维分析、流批数据复用,以及在这些应用案例中可达成的收益。

/ 流式数据计算 /

针对实时数仓的流式数据计算场景,实时数仓链路中的数据都在 Kafka 这种 MQ 组件中,中间不会落地,而且在维表关联场景中还会引入其他的存储选型(比如 MySQL 或者高性能的 KV 存储)。这种架构带来的痛点主要有三点:

首先,整体链路依赖组件环境复杂、运维成本高;

其次,中间数据不落地带来的开发调试和数据测试困难的问题,需要额外起一个 dump 任务将数据落到 hive 之后才能做数据验证,周期比较长; 最后,原始数据在 MQ 中,无法高效实现数据回溯。

我们将链路中的依赖组件使用 Hudi 的湖仓一体表做改造之后,可以得到明显收益:环境依赖变轻,组件依赖少,链路简单;表既支持 Flink 流式消费、又支持批式读取,简化了调试验证工作,单需求提效明显;长期未来实现批流计算统一之后,实时离线状态可复用,也就低成本实现了历史数据回溯计算。

/ 实时多维分析 /

针对实时数仓的实时多维分析场景,运营可以基于已有的数据表动态组合维度去做分析,由于 MQ 中的数据不可查、会额外冗余一份数据到 ClickHouse 中,且为了节省资源,会对 ClickHouse 表数据设置 TTL 只保存近期数据,通过 OLAP 组件的方式对外提供查询能力。

使用 Hudi 的湖仓一体表做改造之后,首先不再需要 ClickHouse 组件,且 Hudi 表的存储成本非常低,可以全量存储,最终通过 Presto 引擎对外提供查询能力。由此得到两方面收益:节省了 ClickHouse 这种昂贵的 OLAP 资源;能够支持数据全量查询。

/ 流批数据复用 /

针对流批数据复用场景,实时数仓和离线数仓在原始数据层其实是依赖相同数据源的,以埋点数据为例,实时数仓和离线数仓都会基于客户端全量埋点数据,做依赖埋点、过滤产出 DWD 层,然后再基于埋点 DWD 数据做指标加工,埋点 DWD 层数据的建设需要两份计算和存储资源投入,且离线任务的计算集中在凌晨,资源被大量任务抢占时很难对任务按时拉起及保障数据产出时效性。

通过将实时数仓中埋点 DWD 层数据的存储方式改成 Hudi 湖仓一体表,将表提供给离线数仓使用,此时收益体现在离线数仓的埋点 DWD 层数据不再需要额外投入计算和存储资源,此外,还能提升数据就绪时间。

对于未来规划主要分引擎性能、稳定性和业务功能诉求三方面。

首先,在引擎性能方面,计划实现能够支持多任务并发写入。通过多路 WAL 合并、异步 Flush、内存管理优化等手段不断提升写入/消费吞吐性能;稳定性方面,需要能够更好的感知服务节点,处理客户端读写请求的压力,提升服务负载 balance 的能力。实现服务支持多机房部署,支持数据多机房备份做容灾恢复;最后针对业务功能诉求,计划实现支持对标 Kafka partition 概念及 group consume 的能力。

推荐阅读

Apache Hudi Timeline:支持 ACID 事务的基础

万字长文 | 泰康人寿基于 Apache Hudi 构建湖仓一体平台的应用实践

CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark

数据湖在快手的生产实践

图加速数据湖分析-GeaFlow和Apache Hudi集成

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ApacheHudi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
字节跳动基于 Apache Hudi 的湖仓一体方案及应用实践
目前主流的数仓架构—— Lambda 架构,能够通过实时和离线两套链路、两套代码同时兼容实时数据与离线数据,做到通过批处理提供全面及准确的数据、通过流处理提供低延迟的数据,达到平衡延迟、吞吐量和容错性的目的。在实际应用中,为满足下游的即席查询,批处理和流处理的结果会进行合并。
王知无-import_bigdata
2023/09/18
8850
字节跳动基于 Apache Hudi 的湖仓一体方案及应用实践
农业银行湖仓一体实时数仓建设探索实践
在数字化转型驱动下,实时化需求日益成为金融业数据应用新常态。传统离线数仓“T+N”数据供给模式,难于满足“T+0”等高时效场景需求;依托Storm、Spark Streaming、Flink等实时计算框架提供“端到端”的实时加工模式,无法沉淀实时数据资产,存在实时数据复用性低、烟囱式垂直建设等不足。
ApacheHudi
2023/11/06
1.7K0
农业银行湖仓一体实时数仓建设探索实践
B站基于Hudi+Flink打造流式数据湖的落地实践
上图展示了当前B站实时数仓的一个简略架构,大致可以分为采集传输层、数据处理层,以及最终的AI和BI应用层。为保证稳定性,数据处理层是由以实时为主,以离线兜底的两条链路组成,即我们熟知的批流双链路。
ApacheHudi
2023/09/04
1.3K0
B站基于Hudi+Flink打造流式数据湖的落地实践
尘锋信息基于 Apache Paimon 的流批一体湖仓实践
尘锋信息 (www.dustess.com) 是基于企业微信生态的一站式私域运营管理解决方案供应商,致力于成为全行业首席私域运营与管理专家,帮助企业构建数字时代私域运营管理新模式,助力企业实现高质量发展。
从大数据到人工智能
2023/05/03
4K1
尘锋信息基于 Apache Paimon 的流批一体湖仓实践
Apache Paimon毕业,湖仓架构的未来发展趋势!
恭喜Paimon进入一个新的篇章,这篇文章也是我个人结合当前整个湖仓领域的发展和实践写的一个总结性质的文章。
王知无-import_bigdata
2024/05/07
5580
Apache Paimon毕业,湖仓架构的未来发展趋势!
快手:从 Clickhouse 到 Apache Doris,实现湖仓分离向湖仓一体架构升级
在当今这个数据洪流的信息时代下,数据已跃升为企业不可或缺的核心资产。深度挖掘并提炼数据内在价值,成为支撑企业战略决策的重要依据。在此背景下,快手建立了 OLAP 系统,该系统在快手应用极为广泛,每天承载近 10 亿的查询请求,为内外多个业务场景提供数据服务。具体场景包括:
SelectDB技术团队
2024/09/27
4600
实时数仓:实时数仓3.0的演进之路
传统意义上我们通常将数据处理分为离线数据处理和实时数据处理。对于实时处理场景,我们一般又可以分为两类,一类诸如监控报警类、大屏展示类场景要求秒级甚至毫秒级;另一类诸如大部分实时报表的需求通常没有非常高的时效性要求,一般分钟级别,比如10分钟甚至30分钟以内都可以接受。
Freedom123
2024/03/29
5930
实时数仓:实时数仓3.0的演进之路
腾讯游戏广告流批一体实时湖仓建设实践
腾讯游戏广告业务对数据准确性和实时性均有诉求,因此数据开发团队分别搭建了离线及实时数仓。技术视角下,这是典型的Lambda架构,存在数据口径不一致、开发维护成本高等弊端。在降本增效的大背景下,我们针对结合计算引擎Flink与数据湖技术Iceberg建设流批一体实时湖仓做了较多的探索和实践,已经具备可落地可复制的经验。借助Flink框架支持批处理作业的能力,我们实现了将流处理层和批处理层的计算层面统一于Flink SQL,存储层面统一于Iceberg。
可君
2023/01/10
2K0
湖仓一体
我理解就是各类数据爆发的公司当前数据平台架构遇到了各类各样的问题,寻求一个适配公司、平台的数据架构,一站式解决,但是大家对湖、仓本质的理解可能都不太一样,那又怎么谈湖仓一体呢。
jasong
2024/11/22
3420
湖仓一体电商项目(一):项目背景和架构介绍
湖仓一体实时电商项目是基于某宝商城电商项目的电商数据分析平台,本项目在技术方面涉及大数据技术组件搭建,湖仓一体分层数仓设计、实时到离线数据指标分析及数据大屏可视化,项目所用到的技术组件都从基础搭建开始,目的在于湖仓一体架构中数据仓库与数据湖融合打通,实现企业级项目离线与实时数据指标分析。在业务方面目前暂时涉及到会员主题与商品主题,分析指标有用户实时登录信息分析、实时浏览pv/uv分析、实时商品浏览信息分析、用户积分指标分析,后续还会继续增加业务指标和完善架构设计。
Lansonli
2022/07/30
1.3K0
湖仓一体电商项目(一):项目背景和架构介绍
字节跳动基于 Apache Hudi 构建实时数仓的实践
导读:今天很高兴能与大家分享字节数据平台在实时数仓中的一些实践。目前在数据湖和Hudi相关的一些基本技术原理方面社区已有较多的介绍,所以我们今天的分享主要聚焦于实践部分的内容。
从大数据到人工智能
2022/10/05
2.4K0
字节跳动基于 Apache Hudi 构建实时数仓的实践
字节电商场景基于Apache Hudi的落湖实践
字节跳动早期为了快速支持业务,对于电商流量数据采用Lambda的设计架构,由于当前电商流量数据随着建设的深入和精细化的运营,设计架构的弊端也愈发凸显。
ApacheHudi
2023/09/25
4590
字节电商场景基于Apache Hudi的落湖实践
干货|流批一体Hudi近实时数仓实践
传统意义上的数据集市主要处理T+1的数据。随着互联网的发展,当前越来越多的业务场景对于数据时效性提出了更高的要求,以便及时快速地进行数据分析和业务决策,比如依托实时数据情况开展实时推荐、实时风控、实时营销等。特别是各种新技术的出现、发展和日趋成熟,实时数据分析和处理也成为可能。实时的大规模数据处理成为企业数字化转型过程中需要破解的难题,也是企业当前面临的一个普遍需求。
大数据老哥
2021/08/25
6.5K0
干货|流批一体Hudi近实时数仓实践
Apache Hudi在腾讯的落地与应用
Apache Hudi是一个基于数据库内核的流式数据湖平台,支持流式工作负载,事务,并发控制,Schema演进与约束;同时支持Spark/Presto/Trino/HIve等生态对接,在数据库内核侧支持可插拔索引的更新,删除,同时会自动管理文件大小,数据Clustering,Compaction,Cleanning等
ApacheHudi
2022/12/09
1.9K1
Apache Hudi在腾讯的落地与应用
字节跳动基于Doris的湖仓分析探索实践
导读:Doris是一种MPP架构的分析型数据库,主要面向多维分析、数据报表、用户画像分析等场景。自带分析引擎和存储引擎,支持向量化执行引擎,不依赖其他组件,兼容MySQL协议。
从大数据到人工智能
2022/09/14
1.2K0
字节跳动基于Doris的湖仓分析探索实践
数据湖技术在抖音近实时场景的实践
首先,数据湖可存储海量、低加工的原始数据。在数据湖中开发成本较低,可以支持灵活的构建,构建出来的数据的复用性也比较强。
从大数据到人工智能
2022/11/30
7920
数据湖技术在抖音近实时场景的实践
数据湖|Flink + Iceberg 全场景实时数仓的建设实践
摘要:Apache Flink 是目前大数据领域非常流行的流批统一的计算引擎,数据湖是顺应云时代发展潮流的新型技术架构,以 Iceberg、Hudi、Delta 为代表的解决方案应运而生,Iceberg 目前支持 Flink 通过 DataStream API /Table API 将数据写入 Iceberg 的表,并提供对 Apache Flink 1.11.x 的集成支持。
大数据技术架构
2021/08/25
4.6K0
数据湖|Flink + Iceberg  全场景实时数仓的建设实践
腾讯广告业务基于Apache Flink + Hudi的批流一体实践
广告主和代理商通过广告投放平台来进行广告投放,由多个媒介进行广告展示 ,从而触达到潜在用户。整个过程中会产生各种各样的数据,比如展现数据、点击数据。其中非常重要的数据是计费数据,以计费日志为依据向上可统计如行业维度、客户维度的消耗数据,分析不同维度的计费数据有助于业务及时进行商业决策,但目前部门内消耗统计以离线为主,这种T+1延迟的结果已经无法满足商业分析同学的日常分析需求,所以我们的目标为:建设口径统一的实时消耗数据,结合BI工具的自动化配置和展现能力,满足业务实时多维消耗分析,提高数据运营的效率和数据准确性。
大数据真好玩
2022/06/17
1.4K0
腾讯广告业务基于Apache Flink + Hudi的批流一体实践
Apache Hudi在华米科技的应用-湖仓一体化改造
华米科技是一家基于云的健康服务提供商,拥有全球领先的智能可穿戴技术。在华米科技,数据建设主要围绕两类数据:设备数据和APP数据,这些数据存在延迟上传、更新频率高且广、可删除等特性,基于这些特性,前期数仓ETL主要采取历史全量+增量模式来每日更新数据。随着业务的持续发展,现有数仓基础架构已经难以较好适应数据量的不断增长,带来的显著问题就是成本的不断增长和产出效率的降低。
ApacheHudi
2021/10/21
9900
Flink 数据湖 助力美团数仓增量生产
整个架构图分为三层,从下往上看,最下面一层是数据安全,包括受限域认证系统、加工层权限系统,应用层权限系统,安全审计系统,来保证最上层数据集成与处理的安全;
kk大数据
2020/12/29
1.7K0
Flink 数据湖 助力美团数仓增量生产
推荐阅读
相关推荐
字节跳动基于 Apache Hudi 的湖仓一体方案及应用实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档