大数跨境

离线数仓、实时数仓、湖仓一体到底有什么区别?一文讲清

离线数仓、实时数仓、湖仓一体到底有什么区别?一文讲清 商业智能研究
2026-09-09
2
导读:很多人第一次接触数据架构,很容易把它理解成一条升级路线:离线数仓 → 实时数仓 → 湖仓一体。
很多人第一次接触数据架构,很容易把它理解成一条升级路线:

离线数仓 → 实时数仓 → 湖仓一体。

于是产生一个误区:

离线数仓比较旧,实时数仓更先进,湖仓一体就是最终形态。

但真正做企业数据平台会发现,这三者并不是简单的替代关系。

一家大型企业完全可能同时存在:

每天凌晨运行的离线数仓、秒级更新的实时链路,以及存放海量日志和历史明细的湖仓平台。

因为它们解决的本来就是三个不同的问题:

数据什么时候算、数据如何流动、越来越多的数据到底怎么存和怎么管。

在正式展开之前,我整理了一套《数据仓库建设解决方案》,里面涉及数据同步、ETL、实时数据处理、数仓建设等常见场景。

如果最近正在规划数据平台,或者想重新梳理企业现有的数据架构,可以拿来做参考。

需要自取:https://s.fanruan.com/xwgup



一、离线数仓:核心不是“慢”,而是批量处理


所谓离线数仓,最典型的模式就是:

先积累一批数据,再集中加工。

例如企业每天都会产生订单、采购、库存、客户、财务等业务数据。

到了凌晨,再统一把前一天的数据抽取到数仓,并按照:

ODS → DWD → DWS → ADS

逐层加工。

    • ODS尽量保留源系统的数据原貌;
    • DWD完成清洗、去重、编码统一和明细加工;
    • DWS围绕客户、商品、组织等主题进行汇总;
    • ADS最终面向报表和具体分析场景提供数据。


    所以离线数仓真正擅长的是:

    大批量、复杂、允许存在一定时间窗口的数据计算。

    比如财务日报、月度经营分析、历史趋势、绩效考核、监管报送,本身就不一定要求数据变化后5秒钟看到。

    这些场景反而更看重:

    结果准不准、口径稳不稳、任务能不能重复执行。

    假设“销售收入”需要关联订单、退货、客户、组织、汇率、商品六张表,再按照一系列复杂规则加工。

    与其让这套逻辑24小时持续计算,不如每天集中跑一次。

    这背后其实是在做一种取舍:

    用一定的时效性,换取更稳定的批量计算。

    真正麻烦的往往不是建第一张表,而是系统越来越多以后,每天几十上百条同步和加工任务怎么稳定衔接。

    比如:

      • ERP凌晨1点完成抽取;
      • CRM凌晨1点半同步;
      • 客户主数据必须在订单宽表之前完成;
      • 订单宽表跑完以后,才能继续计算区域收入和客户利润。

      任务之间一旦存在依赖,靠大量脚本和人工排时间,很容易出现前面还没结束、后面已经开始跑的情况。

      在这种场景里,FineDataLink 5.0 可以直接参与离线链路的组织:数据库、文件、API等数据按照计划进入数仓,后续继续完成清洗、转换和任务衔接。

      随着任务越来越多,重点就不只是“把表同步过去”,而是让整条加工链能够按照依赖顺序稳定运行。


      当然,离线数仓也有天然边界:

      数据只有进入下一批次,才能被看到。

      如果库存上午10点已经跌破安全线,而数据每天凌晨才处理一次,那么业务可能第二天才发现。

      当“晚几个小时知道”和“现在知道”会产生完全不同的业务结果时,就需要实时数仓。


      二、实时数仓:改变的不是调度频率,而是计算模型


      很多企业所谓的“实时”,其实只是:

      原来每天跑一次,现在每5分钟跑一次。

      这种方式严格来说更接近

      高频批处理。

      真正的实时数仓,数据处理方式已经发生变化。

      离线数仓面对的是一批有限数据。

      比如:

      昨天一共1000万条订单。

      这1000万条数据有明确开始,也有明确结束。

      但实时计算面对的是:

      一条没有终点的数据流。

        • 第1条订单来了,处理;
        • 第2条来了,继续处理;
        • 第1000万条处理完,第1000万零1条还会继续进来。

        所以实时架构通常会变成:

        业务数据库 → CDC/Kafka → Flink等流计算 → 实时明细层 → 实时汇总层 → BI/预警/业务系统。


        这时候真正困难的问题已经不只是SQL。

        还包括:

        状态、窗口、乱序、重复、容错。

        例如统计:

        最近10分钟每个门店的销售额。

        这里马上会产生几个问题:

          • 最近10分钟按照订单产生时间算,还是按照系统收到数据的时间算?
          • 一条订单因为网络延迟晚了3分钟才到,要不要重新计算?
          • 任务突然中断,恢复以后应该从哪里继续?
          • 同一条消息被消费两次,会不会导致销售额重复?

          这些问题,离线批处理里相对容易通过重跑解决,但到了实时链路中,就必须在系统设计时考虑。

          所以实时数仓真正难的并不是“快”。

          而是:

          数据持续变化时,仍然保证结果正确。

          这也是为什么企业很少真的把整个数仓全部实时化。

          组织架构、商品分类、地区编码、月度预算,这些数据本身就没有秒级价值。

          真正适合实时化的通常是:

          订单、支付、库存、物流、设备、风控、用户行为。

          判断一张表要不要实时,有一个很实用的问题:

          如果晚一天知道,业务会不会失去采取行动的机会?

          如果不会,就没必要为了“实时”增加整条链路的复杂度。



          三、湖仓一体:解决的不是实时,而是湖和仓为什么要重复存数据


          随着企业数据继续增长,传统数仓会遇到另外一个问题:

          数据已经不只是数据库里的表。

          企业开始出现:

          用户埋点日志、设备传感器数据、JSON、文本、图片、模型训练数据,以及越来越多的历史明细。

          如果这些数据全部先整理成严格的表结构,再进入传统数仓,成本会越来越高。
          所以出现了数据湖。


          数据湖最初的思路很直接:

          先把原始数据低成本保存下来,需要的时候再处理。

          于是大量数据进入HDFS、对象存储。

          但早期数据湖也很容易走向另外一个极端。

          文件越来越多以后,人们开始发现:

            • 不知道哪份数据最新;
            • 不知道Schema是什么;
            • 不知道谁修改过;
            • 不知道历史版本还能不能恢复。

            最后数据湖逐渐变成:

            数据沼泽。

            湖仓一体真正想解决的,就是这个问题:

            保留数据湖低成本、开放存储的特点,同时补上数仓对数据表的管理能力。


            这里最关键的一层其实是:

            表格式。

            例如 Iceberg、Delta Lake、Hudi。

            传统数据湖里可能只是:

            • part-001.parquet
            • part-002.parquet
            • part-003.parquet

            一个个文件。

            而表格式会在这些底层文件之上增加元数据管理,让上层计算引擎知道:

              • 哪些文件属于当前版本;、
              • 表结构发生过什么变化;
              • 哪些数据被新增、修改、删除;
              • 某个历史时刻的数据究竟是什么状态。

              这样才能进一步实现:

              Schema演进、事务一致性、版本回溯、增量读取。

              所以湖仓一体和“把文件扔进对象存储”最大的区别,不是有没有数据湖,而是:

              这些数据能不能像数据库里的表一样持续被管理。

              湖仓架构真正落地以后,企业面对的也不是一句“数据都进湖了”这么简单。

                • 业务数据库可能每天批量同步;
                • 订单和库存变化需要通过CDC快速进入下游;
                • 日志和文件又有自己的采集路径。

                这时候可以借助 FineDataLink 5.0 分别处理批量数据和实时变化:变化频率低的数据按周期同步,时效要求高的数据持续采集,在进入下游之前再完成必要的清洗和转换。


                重点不是把所有数据都变成实时,而是:

                不同类型的数据按照自己的特点,进入合适的存储和计算链路。

                这里还需要特别注意:

                湖仓一体 ≠ 实时数仓。

                一家企业完全可以采用湖仓架构,但每天只计算一次。

                因为湖仓一体主要回答的是:

                数据存在哪里、怎样统一管理。

                实时数仓回答的是:

                数据发生以后,多快能够被计算和使用。


                四、真正理解三种架构,要看这5个维度


                如果只记:

                离线慢、实时快、湖仓数据多,

                其实还是停留在表面。

                真正理解三者,可以从五个维度来看。

                1.数据进入方式

                离线数仓通常依赖:

                批量抽取。

                例如每天读取一次增量数据,或者定期抽取整张表。

                实时数仓则更多依赖:

                CDC、消息队列、流式采集。

                数据库里一旦发生新增、修改、删除,就可以捕获这些变化继续向下游传递。

                湖仓本身并不限定采集方式。

                它既可以接批量数据,也可以接实时数据。


                2.计算模型

                离线数仓处理的是:

                有界数据集。

                昨天的数据就是昨天的数据,计算有明确开始和结束。

                实时数仓处理的是:

                无界数据流。

                数据会不断进入,因此必须额外处理窗口、状态和事件时间。

                湖仓一体更多是统一底层数据,上层既可以进行批处理,也可以承接流计算、BI甚至机器学习任务。

                3.存储形态

                传统数仓通常使用关系型数据库或者MPP数仓。

                湖仓更多使用:

                对象存储 + Parquet/ORC + Iceberg/Delta/Hudi。

                为什么?

                因为当数据量从几个TB增长到几十TB、几百TB甚至PB以后:

                存储成本会逐渐变成必须考虑的问题。


                4.数据一致性

                离线任务出现问题,可以重新跑一个分区。

                实时链路却不能轻易从头再来。

                因此会更多涉及:

                Checkpoint、Offset、幂等写入、Exactly Once。

                湖仓再往前一步,还需要解决:

                文件级更新、事务和版本一致性。

                5.成本结构

                离线任务的计算资源可以:

                任务来了再跑。

                实时任务却通常需要长期保持运行。

                湖仓虽然能够降低海量数据的存储成本,但也会增加表格式、元数据、计算引擎以及治理层面的复杂度。

                所以企业真正做架构选型时,不能只比较谁功能更多。

                还要考虑:

                为了把数据从T+1缩短到分钟级甚至秒级,企业愿意增加多少长期成本?

                现实中,一家企业通常也不会只有一条数据链。

                  • 订单变化可能需要实时处理;
                  • 历史订单每天晚上统一汇总;
                  • 日志数据直接长期保存;
                  • 组织和地区维表每天同步一次就够了。

                  如果全部强制使用同一种模式,反而会增加无意义的复杂度。

                  在 FineDataLink 5.0 里,可以分别针对这几类数据安排定时任务、实时任务以及对应的数据处理流程。

                  什么数据需要持续流转,什么数据每天集中处理,可以直接跟着业务的时效要求来拆,而不是先定下“全实时”或者“全离线”,再让所有数据迁就架构。



                  五、企业真正的架构,通常不是三选一


                  到了这里其实就会发现:

                  真正的问题从来不是:

                  “离线、实时、湖仓一体到底选哪个?”

                  而应该拆成几个更具体的问题。

                  第一,哪些数据值得实时?

                  订单状态、库存、支付、设备异常可能需要实时。

                  财务月结、历史趋势、组织架构不需要。

                  所以比较合理的做法往往是:

                  关键业务实时化,大规模统计继续离线。

                  把实时资源花在真正能够影响业务动作的数据上。

                  第二,哪些数据值得进入湖仓?

                  也不是所有企业一开始就需要湖仓。

                  如果一家企业只有几个业务系统,数据量几百GB或者几个TB,主要需求就是固定报表,那么传统数仓完全可能已经够用。

                  湖仓真正开始体现价值,通常是企业逐渐出现:

                  海量历史数据、多类型数据、AI训练需求、多计算引擎并存。

                  这时候如果BI复制一份数据、算法再复制一份、实时平台继续复制一份,数据冗余和存储成本会越来越高。


                  第三,离线和实时怎样保持口径一致?

                  这是很多企业非常容易忽略的问题。

                  比如实时看板显示今天销售额1.02亿元。

                  第二天离线数仓重新跑完以后,却变成了1亿元。

                  为什么?

                    • 可能是实时链路没有处理退款;
                    • 也可能是迟到数据第二天才补进来;
                    • 或者离线和实时使用了两套不同的业务规则。

                    所以成熟的实时数仓不能只追求:

                    “今天看得快。”

                    还要保证:

                    “今天看到的数据,明天重新计算之后基本能够闭合。”

                    否则业务会开始怀疑:

                    到底应该相信实时看板,还是相信第二天的经营日报?

                    第四,链路越来越多以后还能不能管住?

                    数据平台刚开始建设时,可能只有十几个任务。

                    几年以后可能变成:

                    几百张表、几十个系统、上千条加工和同步任务。

                      • 有些凌晨跑;
                      • 有些全天运行;
                      • 有些依赖Kafka;
                      • 有些通过API传输。

                      真正容易失控的,就是这些链路慢慢变成:

                      一套脚本、一套调、一套实时程序,再加一堆没人敢动的历史任务。

                      这类场景下,FineDataLink 5.0 可以把定时同步、实时任务和数据加工放在一起管理。

                      新增数据源、调整加工规则或者排查任务异常时,不需要再分别翻不同脚本和程序,而是能够沿着数据处理过程继续往下查。


                      对于同时存在离线数仓、实时链路甚至湖仓平台的企业来说,这其实比单纯增加一个新的计算引擎更加重要:

                      架构可以越来越复杂,但数据链路不能越来越失控。

                      所以很多企业最终形成的,并不是某一种纯粹架构。

                      而是:

                      离线打底 + 实时补充 + 湖仓扩展。

                      比如:

                        • 财务、历史经营分析继续走离线数仓;
                        • 订单、库存、支付、设备监控进入实时链路;
                        • 日志、行为数据、IoT明细和模型训练数据进入湖仓。

                        三种架构同时存在,并不代表架构混乱。

                        真正关键的是:

                        每一类数据为什么走这条链路,是不是有明确理由。


                        写在最后


                        离线数仓、实时数仓、湖仓一体,表面看都是数据架构,实际上它们解决的是三个层次的问题:

                          • 离线数仓解决“如何稳定地批量计算”;
                          • 实时数仓解决“如何持续处理正在发生的数据”;
                          • 湖仓一体解决“越来越多的数据如何低成本保存,并且像数仓一样管理”。

                          所以技术演进真正发生的,并不是:

                          旧架构不断被新架构淘汰。

                          而是企业面对的数据问题越来越复杂以后,需要的能力越来越多。

                            • 有些数据需要秒级响应;
                            • 有些数据更在乎准确和稳定;
                            • 有些数据今天可能没有价值,但半年以后可能会用于模型训练和历史回溯。

                            最终成熟的数据架构,不是把Kafka、Flink、Iceberg、CDC这些技术全部装进去。

                            而是能够回答清楚:

                              • 什么数据值得实时?
                              • 什么数据适合批处理?
                              • 什么数据值得长期保留?
                              • 每增加一层技术复杂度,到底解决了什么业务问题?

                              把这几个问题想明白,离线数仓、实时数仓和湖仓一体到底应该怎么用,其实也就清楚了。


                              图片


                              点击【阅读原文】,体验文中同款资料包


                              图片

                              【声明】内容源于网络
                              0
                              0
                              商业智能研究
                              帆软旗下机构「帆软数据应用研究院」 专注于企业数据化应用、大数据BI技术和理论观点研究,向业界输出前沿的研究与洞察,帮助企业把握商业智能趋势,提升管理与商业战略认知,让数据成为生产力。
                              内容 1129
                              粉丝 0
                              商业智能研究 帆软旗下机构「帆软数据应用研究院」 专注于企业数据化应用、大数据BI技术和理论观点研究,向业界输出前沿的研究与洞察,帮助企业把握商业智能趋势,提升管理与商业战略认知,让数据成为生产力。
                              总阅读14.5k
                              粉丝0
                              内容1.1k