一、流批一体概述:从“两条腿走路”到“一条龙服务”
大家好,我是老赵。做数据架构十几年了,今天咱们聊聊流批一体。
先问个问题:你现在的数据架构,是不是还分着两套系统?一套跑实时,一套跑离线?
我猜八成是。因为我自己带过的项目,早期全是这么干的。但说实话,这种“两条腿走路”的方式,越往后走越别扭。今天这一章,我就把流批一体的来龙去脉、核心优势,以及它到底解决了什么问题,给你掰扯清楚。
1.1 流批一体到底是什么?
流批一体,说白了就是一套技术栈,同时搞定实时流处理和离线批处理。
传统架构里,实时用 Flink、Spark Streaming,离线用 Hive、Spark SQL。两套代码、两套运维、两套数据口径。你想想看,光是对齐两边的业务逻辑,就能让数据团队吵上半天。
流批一体要做的,就是把这两条线合并成一条。同一份数据,同一套 API,同一个引擎,既能跑批,也能跑流。
核心定义:流批一体不是简单的“流+批”,而是从计算引擎、存储层、元数据到开发接口的全链路统一。它让“流”和“批”变成同一枚硬币的两面。
1.2 发展历程:我是怎么看着它一步步走过来的
我记得 2015 年左右,大家还在纠结 Lambda 架构。那会儿我参与过一个金融风控项目,实时用 Storm,离线用 Hive。每次上线新规则,两边都得改代码,还得对半天口径。有一次因为时间窗口算错了,线上出了个 P0 事故。嗯,从那以后我就开始琢磨,能不能别这么折腾了。
流批一体的发展,大致经历了三个阶段:
| 阶段 | 时间 | 代表技术 | 特点 |
|---|---|---|---|
| 萌芽期 | 2014-2016 | Storm、Spark Streaming | 微批处理为主,实时性有限,与离线完全割裂 |
| 探索期 | 2017-2019 | Flink、Beam | 真正的流处理出现,开始尝试统一 API |
| 成熟期 | 2020-至今 | Flink SQL、Spark 3.x、Kafka + Hudi/Iceberg | 存储与计算全面统一,生产级落地案例增多 |
我个人觉得,真正的转折点是 Flink 1.9 之后。那会儿 Flink 把批处理也纳入了自己的体系,用同一套 Runtime 跑流和批。我当时在内部做技术选型,看到这个特性,心里就踏实了。
1.3 与传统架构的对比:到底差在哪?
咱们拿 Lambda 架构来对比。Lambda 架构长这样:
- 批处理层:全量数据,高延迟,精确结果
- 流处理层:增量数据,低延迟,近似结果
- 服务层:合并两边的结果,对外提供服务
看着挺合理对吧?但实际跑起来,问题一堆。
我曾经踩过的坑:Lambda 架构最大的坑是“口径不一致”。批处理算的是 T+1 的精确值,流处理算的是实时的近似值。两边一合并,用户看到的数据一会儿跳高一会儿跳低。业务方天天追着问:“你们的数据到底准不准?”
流批一体架构就不一样了。它只有一套代码、一套口径、一套运维。对比一下:
| 对比维度 | Lambda 架构 | 流批一体架构 |
|---|---|---|
| 开发效率 | 两套代码,双倍工作量 | 一套代码,一次开发 |
| 数据一致性 | 难以保证,口径经常对不上 | 天然一致,同一套逻辑 |
| 运维成本 | 两套集群,两套监控 | 一套集群,统一运维 |
| 资源利用率 | 资源各自独立,容易浪费 | 资源共享,弹性调度 |
| 学习成本 | 团队要掌握多种技术栈 | 只需精通一种引擎 |
1.4 核心优势:为什么我建议你尽早切换
说了这么多,流批一体到底好在哪?我总结了几点:
- 开发效率翻倍——写一次逻辑,跑两种模式。我团队之前做实时大屏和离线报表,两个组各写各的。后来统一到 Flink SQL,一个人就能搞定。
- 数据质量有保障——同一套代码,流和批的结果天然对齐。业务方再也不用问“为什么实时和离线数据不一样”了。
- 运维省心——一套集群,一套监控,一套告警。我见过最夸张的 Lambda 架构,光维护两套集群就占了运维团队一半的精力。
- 资源弹性好——流批共用资源池,白天跑实时,晚上跑批处理。资源利用率能提升 30% 以上。
- 架构简洁——少了一层“服务层”的合并逻辑,整个链路更短,故障点更少。
我的建议:如果你现在还在用 Lambda 架构,别急着全量迁移。可以先挑一个业务线试点,比如把某个实时报表和离线报表统一到 Flink SQL 上。跑通了,再逐步推广。我当年就是这么干的,稳得很。
1.5 流批一体核心架构图
下面这张图,是我自己画的一个流批一体核心架构。你可以看到,从数据源到存储层,再到计算引擎和上层应用,全部是统一的。
这张图想表达的核心思想是:从数据摄入到最终输出,每一层都是统一的。存储层用 Hudi 或 Iceberg 这种支持流批读写的表格式,计算层用 Flink 这种原生支持流批一体的引擎。上层应用只管消费数据,不用关心底层是流还是批。
1.6 避坑指南:流批一体不是银弹
最后说点实在的。流批一体虽然好,但不是所有场景都适合。
我曾经犯过的错:有一回,我们想把一个复杂的实时风控系统也改成流批一体。结果发现,风控场景对延迟要求极高(毫秒级),而批处理模式根本满足不了。最后只能把风控单独拎出来,还是用纯流处理。所以,别为了统一而统一。
适合流批一体的场景:
- 实时报表 + 离线报表(口径统一)
- 实时数仓 + 离线数仓(数据一致性要求高)
- 数据中台(需要同时服务实时和离线应用)
不适合的场景:
- 超低延迟(毫秒级)的实时风控或交易系统
- 超大规模(PB 级)的纯批处理,且对实时性无要求
- 已有成熟的 Lambda 架构,且运行稳定,迁移成本过高