华人澳洲中文论坛

热图推荐

    百度流批一体的实时多维剖析理论

    [复制链接]

    2023-1-9 15:15:22 17 0

    导读:明天给大家带来的分享主题是流批一体的实时多维剖析。分享次要分为 4 个部份,首先是大数据架构演进引见,从传统的经典离线架构到 Lambda 架构, Kappa 架构,剖析一下各种架构的优缺陷;接上去引见咱们的业务痛点,以及流批一体的解决计划;第三部份会重点引见咱们的流批一体计划在落地过程当中遇到的问题,以及咱们的解决办法;最初是总结以及将来布局。
    次要内容如下:
    大数据架构演进流批一体计划症结问题冲破总结和布局分享佳宾|郑德来 百度 资深研发工程师
    编纂整顿|Brandon OPPO
    出品社区|DataFun
    01
    大数据架构演进
    1. 经典离线数仓架构
    在经典离线数仓架构中,最底层是数据源,包罗日志打点、DB 存储的数据,以落第三方回传数据等等;ODS 层为数据操作层,次要用来做简略的荡涤,存储一些根底数据;在 ODS 层之上是 DWD 层,在该层会构建出最细粒度的明细事实表;DWD 层之上是 DWS 汇总数据层,在这一层会按主题对明细数据进行汇总;最下层是 ADS 运用数据层,寄放业务的共性化统计目标。

    gaqhrl1lesh.jpg

    gaqhrl1lesh.jpg


    经典离线数仓优点是架构简略,开发本钱与资源本钱低,数据容易办理,同时由于没有实时数据,也不会存在离线实时数据 diff 的问题。
    经典离线数仓最大的问题首先是数据提早的问题,跟着业务的繁杂性愈来愈高,数仓繁杂度也会不停的晋升,需求关联的数据源也愈来愈多,数据的总体产出时效,就会有各种问题,包罗输出数据流断流,数据提早等在传统数仓常见的问题。
    第二个问题是缺属实时数据,通常数据的产出时效都是小时或者天级别,有些数据量对比大可能会是周级别乃至月级别产出,无奈撑持起业务对数据时效性的诉求。
    第三个问题是表的数量太多,由于一些繁杂的业务场景 ODS 表可能有几百张,产出数据时需求做少量的关联,数仓使用体验变差,同时关联查问也会致使数据产出的时效变差。

    ldu5ohn3nwo.jpg

    ldu5ohn3nwo.jpg


    2. Lambda架构引见
    Lambda 架构泛起的初衷是为了补救经典数仓时效性差的问题。
    全部 Lambda 架构能够分为 3 层,首先图中最左侧的是 Batch Layer 层,也就是批处置层,在批处置层复用了经典离线数仓的分层架构,在技术栈上也是与经典数仓统一,使用 MR, Hive, Spark 等离线计算框架。
    第二层是右侧的 Speed Layer 减速数据层,用于产出时效性高的一些数据。Speed Layer 层对数据精确性和残缺性会有一些升级。Speed Layer 层采取 Kafka 等动静两头件来进行数据的传输和存储,使用 Storm,Spark Streaming,Flink 进行数据的计算。
    Lambda 架构的第三层就是 Server 层办事层,在办事层中会把 Speed 层和 Batch 层的数据进行合并,或者交换输入到数据库中来反对数据运用。

    xglnwxc50mq.jpg

    xglnwxc50mq.jpg


    Lambda 层中的 Speed 层让数据的产出时效大大提前了,同时拥有 Speed 层和Batch 层让 Lambda 架构统筹了数据的精确性和时效性。此外Lambda架构中的 Batch 层沿用经典离线数仓的架构,在经典离线数仓迁徙到 Lambda 架构时,Lambda 架构是能够兼容经典数仓架构的。
    Lambda 架构的缺陷就是一个需要会有两套代码,一套离线,一套实时,形成了开发本钱和运维本钱的挥霍。第二就是资源的挥霍,一份离线资源一份实时资源,两份资源致使总体资源占用对比多。第三个问题就是数据的 diff 问题,由于它是实时和离线两条流,它的数据逻辑实质是不成能彻底对齐的,这也是 Lambda 架构最大的一个痛点。

    osn50552uak.jpg

    osn50552uak.jpg


    3. Kappa 架构引见
    Lambda 架构自身拥有 Batch 和 Speed 两条流,Speed 层的数据精确性是不被信赖的,次要需求 Batch 层来包管数据的精确性,跟着流式计算框架的开展,不重不丢语义的反对,终究演化出了 Kappa 架构。

    4g1qjoue1dx.jpg

    4g1qjoue1dx.jpg


    Kappa 架构的中心思想就是去掉 Lambda 架构的 Batch 层,实时和离线使用同一套代码,经过一套代码来知足业务对数据的精确性和实时性的要求。
    Kappa 架构也不是完善的,好比咱们正常的业务会常常遇到一些口径的变卦,这些口径的变卦会带来数据回溯的问题,由于它是没有离线这条数据流的,数据回溯就需求靠数据从新消费来解决。这类回溯本钱十分高,对全部零碎的吞吐压力应战对比大。
    同时,跟着业务的繁杂度不停减少,它的数据源的繁杂度也会减少,跟着数据的减少,关联场景对比多,会见临各种繁杂关联场景的应战。关联愈来愈繁杂,开发和保护的本钱也会变得十分高。
    第三个就是关于一些新业务,它的数仓根本是从零开始搭建,这个时分搭建一个 Kappa 架构会相对于简略,然而咱们的数仓建立其实都是有历史包袱的,并不是欲速不达,而是通过一定的演化过去的,这样在革新时就需求对一些存量逻辑做实时的革新,Kappa架构是没有 Batch 这条流的,需求彻底交换调离线,这样的革新往往本钱是十分高的,同时收益对比小,这也是 Kappa 架构很难大标准铺开的一个很症结缘故。

    yrxsao2xrp3.jpg

    yrxsao2xrp3.jpg


    02
    流批一体计划
    1. 流批一体配景——旧架构
    首先看一下咱们的旧架构,其实也一个 Lambda 架构,左侧深蓝色是离线数据流,右侧浅蓝这部份是实时数据流。离线数据流最底层是咱们的数据源层,数据源次要有两类,一类是日志的打点数据,好比展示的打点,点击的打点,流动的打点。另外一类是来源于业务的 DB 数据库,好比 MySQL,次要是一些定单数据或者物料数据。
    关于这些数据咱们会进行收集,像打点数据个别会采取 Flume 这类日志收集工具,小时级或者天级收集到文件零碎 HDFS 上。关于业务的数据库数据,个别会采取相似与 Sqoop 工具收集到文件零碎下来。这两部数据收集到文件零碎上之后,就是通过离线数据的荡涤和处置,来构建咱们的数据仓库,数据仓库也是采取经典的离线数据仓库架构,再在数据仓库下层承接多维剖析以及数据报表需要。
    右侧实时流的日志打点数据收集,咱们是把它写到动静队列外面去,并非一切日志都收集到动静队列里,由于动静队列本钱比文件零碎高得多,所以有实时需要时咱们才会把它收集到动静队列。关于业务 DB 数据也同样,也是按照业务时效性需求,将 Binlog 日志收集到动静队列里。数据写入到动静队列中之后就是流式计算环节,在流式计算环节中,次要会根据需要分别对数据进行加工,终究知足战略信号,实时报表,实时运用的一些需要。

    3nghsd4rrmi.jpg

    3nghsd4rrmi.jpg


    2. 流批一体配景——旧架构问题
    旧架构从业务诉求角度来看有这么几个问题。
    第一个问题就是,表的数量十分的多,尤为是对比繁杂的业务,ODS 表可能有几百张,这时候业务在使用起来就十分难题,尤为是一些人员的活动对比大,新人刚来对数仓没有那末相熟,彻底学习起来的本钱很高。
    第二个问题就是表的关联场景对比多,一次查问常常要关联几十张表,查问时效慢,这是业务对比敏感的一点。第三个问题是实时候析才能对比弱,由于只要一些定制的实时报表,只面向了某一个场景,短少多维的实时数据剖析才能。

    eqttmak23fj.jpg

    eqttmak23fj.jpg


    3. 流批一体总体计划
    总体上咱们的流批一体计划实际上是采取了一种 Lambda 和 Kappa 的混合架构。首先最底层的数据源,数据收集和数据存储这一块,其实没有大的变动,最症结的变动次要是数据荡涤和数仓这两个环节
    首先,每个字段咱们会按照它的使用场景的时效性要求,来肯定这个字段是走实时流仍是走离线流,好比某个字段时效性要求在分钟级别,这个时分就需求走实时流,而假如只是天级别,周级别那就没须要走实时。然而假如一个字段既有实时又有离线需要,这个时分实时和离线它再也不是一个增补瓜葛,而是一个交换瓜葛,这样来防止 Lambda 架构中最经典的问题,离线实时两套代码致使的数据纷歧致问题。关于没有时效性需要的字段持续沿用离线的处置逻辑,假如强行切换到实时流,动静队列和流式计算的本钱对比高,同时也会减少开发和保护的本钱。
    数据仓库也由以前的分层建模的形式,变为了宽表建模,实时字段和离线字段经过分钟级 Merge 成一张宽表。总体的建模思绪也是再也不面向数据源建模,而是面向终究业务侧的视角,业务使用去建模,那最症结的包管业务方在使用表的时分,表尽可能少,尽可能不做关联,升高使用和学习本钱,同时最次要是查问机能,这是业务最敏感的一个点。而后对数据运用层,咱们降级了一些数据查问引擎。
    目前这个架构全部时效性根本是分钟级别。端到真个耗时,按照数据量,关联逻辑的繁杂水平纷歧样,它的时效性在 5 分钟到 20 分钟不等,知足了咱们业务关于实时多维剖析的诉求。总结起来,业务的诉求是导入时效要求是分钟级别,查问时效是秒级别。偶然一些秒级别的提早需要场景,好比相似大屏或者榜单,这部份咱们仍是会经过定制的实时报表完成。

    jjqp5kg5mfp.jpg

    jjqp5kg5mfp.jpg


    03
    症结问题冲破
    1. DB 数据更新问题——配景
    在计划落地过程当中,第一个问题是 DB 更新数据的问题。由于典型的实时数仓,对比简略的一个场景就是纯日志场景,一切数据源都来自于日志的。
    一个典型的解决计划是,原始日志通过实时收集,写入动静队列中,在流式计算环节,经过固定的时间窗口,把数据写入文件零碎,而后通过下层的查问引擎去实时查问。日志数据有个特征就是它是不会变动的,日志在打印的那一刻数据就固定上去了,然而 DB 数据纷歧样,它是会更新的,好比定单的一些形态,收款退款,或者是一些物料属性,它都会随时产生变动。
    但由于咱们的散布式文件零碎,往往它是不反对更新的,跟着计算窗口的变大,存储才能和可保护性都会变差。

    0fqytqj3jt0.jpg

    0fqytqj3jt0.jpg


    2. DB 数据更新问题——解决计划
    咱们的解决计划,首先 DB 数据会收集变卦信息 Binlog 日志,写入到动静队列中。而后在流式计算框架对变卦的日志数据,好比经过分钟级窗口,写成一些 Delta 文件,来保留 DB 数据的变卦进程。
    在首次上线过程当中,咱们会把 DB 的全量数据进行归档,发生 Base 文件,而后会减少一个 Copy On Write 机制,经过转动 5min 的合并将 Base 文件和 Delta 文件不停进行合并,不停发生最新的一个可用的版本。
    这里咱们没有采取 Merge On Read 的这个计划,症结缘故是在咱们的业务诉求,业务对咱们的查问时效敏感,要求在秒级,假如使用 Merge On Read,就会致使咱们在查问过程当中需求更多的数据处置,查问时效会升高,所以这个一块咱们就义了一部份数据导入机能,来尽可能知足查问的机能要求。

    klrdbdjgzai.jpg

    klrdbdjgzai.jpg


    3. 多表关联问题——配景
    第二个问题是多表关联的问题,一个典型场景是,有一张 DB 的主表,而后几张关联表,经过 Spark 或者其它的离线计算框架,把它们关联在一同而后写入文件零碎中,供查问引擎进行查问。由于 DB 的数据个别记载数特别多,每一个个表的数据量都十分大,那在关联的过程当中可能会促发 Shuffle 机制,机能就会十分差。

    ac1b3c0rpxq.jpg

    ac1b3c0rpxq.jpg


    4. 多表关联问题——解决计划
    咱们的计划是采取三次关联。
    首先对每一个张表按照后面的计划产出一个 Base 文件和一个 Delta 文件,那 Base 文件其实就包孕了主表和关联表的 Base 文件,是一个截止到某个时辰包孕整个记载数的数据快照。Delta 文件它实际上是主表或关联表在某一个流式计算时间窗口的变卦记载。
    第一次关联是用主表的 Delta 文件跟关联表的 Base 文件进行关联,这样就拿到这个主表在窗口内变卦字段的整个形态,这个数据后果本写入到一个 tmpDelta 文件中。
    第二次关联是将 tmpDelta 文件与主表的 Base 文件进行关联,这样就生成为了在某个时间点的整个记载数的 tmpBase 文件,只不外有部份关联字段还没更新。
    第三次关联就是将上步中生成的 tmpBase 与关联表的 Delta 文件进行关联,生成为了一个新的可查问版本。关联表的变卦字段在主表文件里进行更新解释,与上一个问题相似,会随五分钟的时间窗口不停转动上来。
    通常状况下,DB 数据的存量数据对比多,但增量数据对比少,所以 Base 文件根本上十分大,而 Delta 文件都会十分小,虽然是三次关联,但每次关联都存在小数据集,虽然总体关联屡次,但总体的时效性仍是知足预期的。

    jxtwuw4vfvp.jpg

    jxtwuw4vfvp.jpg


    5. DB 和日志关联问题——配景
    第三个问题是日志 DB 数据和日志数据关联的问题。这个问题会更繁杂一些,有一部份数据是来自日志打点,此外一部份数据是来自业务 DB 数据库,咱们的宽表是同时依赖与这两份数据。
    这个场景对比典型的计划就是,把 DB 数据写入到一个相似于高机能的缓存之中,在流式计算环节查问这个缓存,把需求依赖 DB 的那部份字段拼接上,终究再经过一个固定的窗口写入到文件零碎,给查问引擎查问。
    这里有两个问题,一个是要求缓存的容量对比大,可以缓存下一切的 DB 数据,此外一个是日志的吞吐十分高,也会致使在拼接字段的过程当中频繁的查问这个高机能的缓存。这就对缓存的 QPS 和容量有对比高的要求,致使缓存的本钱十分高。

    y50e2dmf0n5.jpg

    y50e2dmf0n5.jpg


    6. DB 和日志关联问题——解决计划
    咱们的解决计划是,首先对日志数据经过日志收集写入动静队列中,在流式计算环节,经过固定的窗口产出 Delta 文件,Delta 文件是不会变的,关于 DB 数据多是一张表或者多张表,多张表就采取以前引见的多表关联的计划,也是转动产出一个可查问的版本
    但这里也有一些变动,采取了一个冷数据别离的计划,由于日志的 Delta 文件它是分钟级转动,合并的时分咱们只合并热数据,对冷数据是会进行天级别的合并,这个完成的升级次要是为了以最低本钱来知足业务最中心的诉求,由于业务最次要的诉求实际上是热数据可以最疾速抵达,关于冷数据能够承受隔天查问。它最症结的是数据精确性统一,总体也参考了 Lambda 的架构思想,虽然有冷热数据不同的两次合并,但合并的逻辑是统一的,不需求同时写两套代码,只不外在资源层面,新增了一份全量冷数据的关联,会多损耗一些资源,但这也不成防止,这样既知足业务的需要,又不会过量的损耗资源。

    zzde4hfbn5k.jpg

    zzde4hfbn5k.jpg


    7. 数据到位时间问题——配景
    咱们建模从以前的分层建模改为了宽表建模,宽表建模最大的一个问题是数据到位时间问题。通常状况下宽表的产出需求依赖一切依赖表,实际状况数据源往往对比繁杂,一部份表是实时产出,而其它表需求繁杂逻辑处置,可能需求 T+1, 乃至 T+2 能力产出。

    sw3isnlmqli.jpg

    sw3isnlmqli.jpg


    8. 数据到位时间问题——解决计划
    针对数据到位时间问题,咱们给出的计划是数据分版本产出,字段按真假化机制。关于一些原始日志,DB 数据,经过后面引见的几个计划,根本能够包管咱们数据字段分钟级产出可查问版本。关于时效性不敏感的字段,能够 T+1 产出世成一个 V2 的数据版本,而一些繁杂计算的或者第三方回传的字段能够 T+2 产出世成终究的数据版本。同一张宽表,业务在使历时会展现字段的可用形态,预计产出的时间。

    fwrmwch1d10.jpg

    fwrmwch1d10.jpg


    04
    总结和布局
    架构选型,首先要合乎业务的现状,解决业务虚际问题,不要为了技术而做技术,症结是解决业务的实际问题,没有最佳的架构,只要最合适咱们业务的架构。第二就是架构选型需求综合考量资源繁杂度与保护本钱,尤为是资源,冀望以最低的本钱去解决业务痛点,把钱花在刀刃上。
    将来布局一个是查问引擎机能继续优化,来晋升查问体验;另外一个是下层查问工具的体验优化。

    g5bjudvkft0.jpg

    g5bjudvkft0.jpg


    05
    发问
    Q1:流批一体架构下,数仓里的大宽表是不是会存在离线数据和实时数据的拼接,仍是会严格离开离线宽表和实时宽表?
    A1:咱们的宽表实时表和离线表是拼在一同的,是一张宽表,只不外是分版本产出。也是面向需要,假如一个字段有实时诉求,那这个字段是实时产出,假如对时效没有那末敏感,那可能就是天级别,周级别,乃至月级别均可以,只不外是多个版本。实时和离线使用的是一张宽表,这样查问的时分不需求再做二次拼接,包管查问的时效性足够快。
    Q2:10 亿级多个大表关联中,Delta 文件不需求跟 Base 文件关联吗?
    A2:Delta文件是需求与 Base 文件关联,只不外它无关联程序,Delta 文件跟 Base文件关联,而后 Base 文件再跟 Delta 文件关联,而后得 Base 文件再跟其余 Delta 文件关联。有三次关联,这里边是包孕 Base 文件和 Delta 文件关联的,由于 Delta 对比小,能够做一些 Mapjoin,Mapjoin 的机能会对比好一些,不像几个大表的间接关联,它的机能会对比差。
    Q3:高机能查问缓存运用了甚么技术?
    A3:高机能缓存技术有得多,好比 Redis、HBase 等,但咱们终究选择了文件零碎,次要是出于本钱的斟酌,咱们在没有减少太多资源的状况,就知足了业务的时效性诉求。本钱对咱们研发来讲压力是对比大的,本钱可能就是第一个对比要务的事件。
    Q4:数仓使用了甚么技术,Doris、Clickhouse、Hive 仍是 Iceberg?
    A4:咱们没有使用开源的引擎,而是使用咱们外部自研的图灵引擎,它是基于文件存储的一个引擎。
    明天的分享就到这里,谢谢大家。
    |分享佳宾|

    cvmc3p2a0yh.jpg

    cvmc3p2a0yh.jpg


    郑德来|百度 资深研发工程师
    郑德来,结业于吉林大学,目前次要担任百度信息流、百家号、电商业务的数据建立任务。
    |DataFun新媒体矩阵|

    zqxunhkgkqa.jpg

    zqxunhkgkqa.jpg


    |对于DataFun|
    专一于大数据、人工智能技术运用的分享与交流。发动于2017年,在北京、上海、深圳、杭州等城市举行超过100+线下和100+线上沙龙、论坛及峰会,已约请超过2000位专家和学者参预分享。其大众号 DataFunTalk 累计出产原创文章800+,百万+浏览,15万+精准粉丝。

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    注册会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题30

    帖子39

    积分180

    图文推荐