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

2023-11-17

cec27584b35439cda172db6531cabf16.png300万字!全网最全大数据学习面试社区等你来!

b8684590e88fbf2d8b806cabddc160bb.jpeg

/ 主流数仓架构 /

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

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

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

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

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

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

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

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

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

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

/ 数据湖方案 /

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

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

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

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

479e848d01316c7888e1e035caa64a9e.png

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

/ 湖仓一体诉求 /

ee24b53bcac64800176ace1f266a2c91.png

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

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

304170080d76b1d6bb04b7ed2434b6e8.jpeg

/ 整体架构 /

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

412647e44840d50875bc8c155892299e.png

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

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

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

/ 数据分布 /

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

5a57c75937071460ed6b540524be52eb.png

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

 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 是一对多的关系。

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

/ 数据模型 /

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

9d37674c2e690092d8448e1fc90296b5.png

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

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

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

/ 数据读写 /

fa8539c27ad7c18243787848a5a5a7aa.png

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

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

/ BTS 架构 /

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

334e7908cadf4c6b863be3dc73539770.png

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 能够实现内存数据持久化,用于异常恢复。此外,在写缓存遭驱逐时,可用于数据读取。

c35f775d24edf6e5ae6595997d8a7d24.jpeg

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

/ 流式数据计算 /

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

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

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

0d4a58a01b175a6be9707e2e3166d454.png

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

/ 实时多维分析 /

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

9df60eefaaac03fa5da16467b6aacf33.png

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

/ 流批数据复用 /

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

3b1fdbdd186fbfebb5a57843af5072e2.png

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

13968a5fd52282736aea421a32e6b2fe.jpeg

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

9c765c14b5d3813a21a26dab5d06778f.png

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

如果这个文章对你有帮助,不要忘记 「在看」 「点赞」 「收藏」 三连啊喂!

c9c9b963ace96439d9284c309883912b.png

14d0d69b85df8e8c4e1761234b54fdd2.jpeg

2022年全网首发|大数据专家级技能模型与学习指南(胜天半子篇)

互联网最坏的时代可能真的来了

我在B站读大学,大数据专业

我们在学习Flink的时候,到底在学习什么?

193篇文章暴揍Flink,这个合集你需要关注一下

Flink生产环境TOP难题与优化,阿里巴巴藏经阁YYDS

Flink CDC我吃定了耶稣也留不住他!| Flink CDC线上问题小盘点

我们在学习Spark的时候,到底在学习什么?

在所有Spark模块中,我愿称SparkSQL为最强!

硬刚Hive | 4万字基础调优面试小总结

数据治理方法论和实践小百科全书

标签体系下的用户画像建设小指南

4万字长文 | ClickHouse基础&实践&调优全视角解析

【面试&个人成长】2021年过半,社招和校招的经验之谈

大数据方向另一个十年开启 |《硬刚系列》第一版完结

我写过的关于成长/面试/职场进阶的文章

当我们在学习Hive的时候在学习什么?「硬刚Hive续集」

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • html中按钮下拉菜单,Bootstrap3.0学习笔记之按钮与下拉菜单

    前面的文章算是把Bootstrap CSS部分简单的学习了一遍 应该忽视了比较多的细节问题 不过大部分的内容我都过了一遍 并且用代码实现了一遍 而且看到了真实的效果 挺不错的 那么接下来的几篇文章主要来讲解Bootstrap的组件 那么本文
  • 回收站被清空如何找回

    回收站被清空如何找回 清空回收站 可以是手动清理也可以是自动定期清理 不过在清空回收站前 还是先排查所有文件 以防止误删的或意外删除的 但很多时候回收站是存放大量临时删除的文件 不可能在去一个一个排查的 通常都是看一下就直接按清空键清空了
  • Request请求

    Request请求 Request请求 就是客户端希望从服务器端获取资源 向服务器发出询问 在B S架构中 就是客户浏览器向服务器发出询问 在我们的JavaEE工程中 客户浏览器发出询问 要遵循HTTP协议所规定的 请求对象 就是在Java
  • java抽象类和接口编程题_Java 抽象类与接口 编程练习

    一 面向抽象编程 7175 编程题 编程语言 Java 題目內容 使用接口或者抽象类编写程序实现显示员工基本信息 具体要求如下 1 使用接口或者抽象类实现基类Employer 体会接口和抽象类的不同 包含姓名 部门和工资三个属性 显示工资的
  • APT攻击各阶段简介

    根据美国国防承包商洛克希德 马丁公司提出的网络杀伤链模型 APT攻击主要由7个阶段组成 分别为侦查跟踪 武器构建 载荷投递 漏洞利用 安装植入 命令与控制 目标达成 阶段1 侦查跟踪 侦查跟踪指攻击者在选定好攻击目标后 收集跟目标有关的情报
  • 基于微信小程序的医院预约挂号系统,附源码、数据库

    博主介绍 程序员徐师兄 7年大厂程序员经历 全网粉丝30W csdn博客专家 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 1 简介 Java基于小程序的医院预约挂号小程序 系统主要功能可以分为后台管
  • 在VS2015中让UnityShader脚本关键词高亮

    在写Unity中的shaderlab时 习惯了VS的同志们 想实现在VS2012 2015中显示Shader 关键字高亮 这里有一个方法 效果如图 这需要一个工具 在我的资源里面 http download csdn net detail
  • 个人IOS技能树

    一转眼 进入IOS领域已经半年了 整理了一下个人发展技能树 暂定时间为一年 技能树的最终目的是成为好的程序员 并且最终超越程序员
  • 使用jQuery创建节点、将节点插入到指定的位置

  • 钉钉应用开发,提示Warning: Invalid CERT Authority

    我司的网页应用与钉钉进行了单点登录的对接 结果在钉钉App中打开提示SSL error 顶上的提示是Warning invalid CERT Authority 点击Yes可以正常访问 只是每次提示很麻烦 应用是Nginx Tomcat架构
  • 关于三通道彩色图像的存储方式理解

    像素值以 矩阵方式 保存 矩阵的大小取决于图像采用的颜色模型 灰度图 如果是灰度图 那么图像就是单通道的 图像中的每个像素只需要一个矩阵元素来保存 一般就是 0 255 的值 保存灰度图的矩阵长这样 其中 Row0 和 Column0 的交
  • 测试用例设计方法——等价类

    等价类 思路 输入的集合是无穷的 不能全部都覆盖到 依据需求将输入 特殊情况下会考虑输出 划分为若干个等价类 从等价类中挑选一个测试用例 如果这个测试用例通过 则认为所代表的等价类通过 这样就可以用较少的测试用例达到尽可能多的功能覆盖 解决
  • usart串口只能发送不能接收

    今天出了一个低级错误 记录一下 下次注意 我想用stm32做一个usart发送和接收的程序 目标 发送用的是usart1串口 接收用的是中断 当有数据发送给单片机的时候 会触发中断 中断函数中将接受到的数据再发送出去 程序非常简单 我就不放
  • SpringBoot项目捕捉@Validated下@NotBlank、@NotNull等注解抛出的异常

    java捕捉 Validated下 NotBlank NotNull等注解抛出的异常 使用场景 新增通用返回实体类 修改controller 实体类添加 NotBlank 新增WebConfig 新增WebExceptionHandler
  • C++学习总结(二十二)——类模板与友元(友元函数,友元类模板)

    一 类模板与友元 当友元函数在外部定义时 友元函数以及所属的类必须声明 友元函数放在类模板的内部时 友元函数可以直接调用 无需加类限定符 include
  • 使用boost库来计算文件夹的大小

    include
  • 投资学实务 期货日志及实践总结

    我的期货交易可以分为三个阶段 摸索阶段9 27 9 30 日期 单日净盈利 累计净值 单日回撤 9 27 14370 0 9707 0 03 9 28 29670 1 0295 0 9 29 11855 1 0517 0 9 30 1647
  • Acwing-27. 数值的整数次方

    由于本题的指数是int范围 可能很大 所以需要用快速幂 Acwing 875 快速幂 中有详细介绍快速幂 点击链接即可传送 求解 https blog csdn net weixin 43844521 article details 127
  • torch.cat过程中遇到的问题

    项目场景 有关深度强化学习过程中使用torch cat遇到的问题 问题描述 在学习MEC 使用深度强化学习改变卸载率的过程中 要将action和state通过torch cat合并的时候遇到的问题 第一个问题 torch cat当中直接使用
  • 在Vim(gvim)中使用cscope

    之前已经详细的介绍了在vim中使用ctags 这篇文章我们就来详细介绍一下如何在vim中使用cscope 首先 我们还是了解一下什么是cscope 简单来讲 cscope主要用来协助浏览C C 语言 他的功能要强大于ctags 不仅支持变量

随机推荐

  • python基础--除法、地板除、取余

    在Python中 有两种除法 一种除法是 gt gt gt 10 3 3 3333333333333335 除法计算结果是浮点数 即使是两个整数恰好整除 结果也是浮点数 gt gt gt 9 3 3 0 还有一种除法是 称为地板除 两个整数
  • libevent涉及的知识积累

    O 1 实现单链表插入删除 阅读libevent源码时发现了linux提供的一个链表 宏定义如下 define LIST ENTRY type struct struct type le next next element struct t
  • msvcp140.dll丢失的解决方法,win10系统dll报错的解决方法

    今天 我将为大家分享一个关于msvcp140 dll丢失的解决方法 特别是针对在Windows 10系统上遇到这个问题的朋友们 在开始之前 我想先简要介绍一下msvcp140 dll文件的作用 msvcp140 dll是Microsoft
  • linux怎么修改目录的所有者,linux修改文件或目录的所有者(chown)和用户组

    chown更改文件或目录的所有者 注意 所有者 必须存在于 etc passwd 下 比如 linux修改文件或目录的所有者 chown 和用户组 更改文件或目录的所有者命令 1 新建测试文件test 命令为 touch test 2 查看
  • 由于找不到msvcp140.dll无法继续执行代码”问题的解决方法

    DLL文件对于Windows上的应用程序至关重要 因为这些文件在运行时是必需的 如果没有这些文件 或者它们已经损坏 相应的应用程序可能会变得不稳定 或者根本无法运行 现在 让我们一起探讨 由于找不到msvcp140 dll无法继续执行代码
  • html提示框延时消失,JS实现提示效果弹出及延迟隐藏的功能

    自动登录勾选提示效果 要求 鼠标移入显示提示信息框 鼠标离开 信息框消失 消失的效果延迟Document sign display inline block width 15px height 15px border 1px solid c
  • 小白的高德地图初体验(一) —— 打点

    小白的高德地图初体验 一 打点 说到高德地图 肯定要推荐官方文档 传送门 走你 小白的高德地图初体验 一 打点 小白的高德地图初体验 二 点聚合 小白的高德地图初体验 三 轨迹 小白的高德地图初体验 四 矢量图形 小白的高德地图初体验 五
  • NetBeans下载安装

    1 下载 网址 Apache NetBeans Releases 2 安装 执行exe 选择安装目录和jdk
  • qemu搭建和运行起来一个linux内核环境

    qemu搭建和运行起来一个linux内核环境 参考了博客 搭建linux调试环境 一 qemu环境搭建vexpress开发平台 Edver 博客园 嵌入式Linux之QEMU模拟器 4 使用busybox制作根文件系统 ReCclay的博客
  • 【数字图像处理】图像的几何变换

    文章目录 图像几何变换的一般思路 图像平移 图像镜像 图像转置 图像缩放 图像旋转 插值算法 最近邻插值 双线性插值 高阶插值 包含相同内容的两幅图像可能由于成像角度 透视关系乃至镜头自身原因所造成的几何失真而呈现截然不同的外观 通过适当的
  • 【类】二维dp:动态规划背包问题

    dp n m 含义就是 当有n种物品时且背包有m容量时 这个背包能产生的最大价值 状态转换关系是 dp n m dp n 1 m dp n 1 m 新物品重量 意思就是 当面对新来的一个物品时 求这个情况下 背包能产生的最大价值 相当于求下
  • GB/T 35273—2020《信息安全技术个人信息安全规范》正式发布

    GB T 35273 2020 信息安全技术个人信息安全规范 2020年3月6日 国家市场监督管理总局国家标准化管理委员会正式发布 GB T 35273 2020 信息安全技术个人信息安全规范 GB T 35273 2020 信息安全技术个
  • LeetCode 53 最大子序列和

    给定一个整数数组 nums 找到一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 示例 输入 2 1 3 4 1 2 1 5 4 输出 6 解释 连续子数组 4 1 2 1 的和最大 为 6 进阶 如果你已经实现复杂度为 O
  • Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?

    Go 面试系列 Goroutine 数量是越多越好吗 设置多少会影响GC调度呢 前言 现在的大厂都开始慢慢使用Go语言了 例如字节已经把Go作为后端开发的主要编程语言 但是Go的面试题总结的比较少 于是打算开启这个专栏 一起学习一起进步 前
  • 使用Koa2进行Web开发(二)静态文件与路由

    静态文件处理 这里选择koa static作为处理静态文件的中间件 const Koa require koa const app new Koa const serve require koa static app use serve d
  • redis连接数合理配置_redis连接数配置多少

    redis客户端连接数 redis通过监听一个TCP端口或socket的方式接收来自客户端的连接 当与客户端建立连接后 redis内部会进行如下操作 1 客户端socket会被设置为非阻塞模式 因为redis在网络时间处理上采用的是非阻塞多
  • 1σ Random Jitter of SSB for TIE & Period

    1 Random Jitter of SSB for TIE Period 该章节厘清了jitter基本概念 并给出了对应的表达式
  • python接口自动化7-post文件上传

    前言 文件上传在我们软件是不可少的 最多的使用是体现在我们后台 当然我们前台也会有 但是了解过怎样上传文件吗 这篇我们以禅道文档 创建文档 上传文件为例 post请求中的 Content Type multipart form data 这
  • 信息安全专业毕业设计选题推荐汇总

    大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的升学就业做准备 一边要为毕业设计耗费大量精力 学长给大家整理了信息安全专业不同方向最新精选选题 如对选题有任何疑问 都可以问学长哦 基于密码学的数据加密算
  • 字节跳动基于 Apache Hudi 的湖仓一体方案及应用实践

    300万字 全网最全大数据学习面试社区等你来 主流数仓架构 目前主流的数仓架构 Lambda 架构 能够通过实时和离线两套链路 两套代码同时兼容实时数据与离线数据 做到通过批处理提供全面及准确的数据 通过流处理提供低延迟的数据 达到平衡延迟