一、流批一体概述:从“两条腿走路”到“一条龙服务”

大家好,我是老赵。做数据架构十几年了,今天咱们聊聊流批一体。

先问个问题:你现在的数据架构,是不是还分着两套系统?一套跑实时,一套跑离线?

我猜八成是。因为我自己带过的项目,早期全是这么干的。但说实话,这种“两条腿走路”的方式,越往后走越别扭。今天这一章,我就把流批一体的来龙去脉、核心优势,以及它到底解决了什么问题,给你掰扯清楚。

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 核心优势:为什么我建议你尽早切换

说了这么多,流批一体到底好在哪?我总结了几点:

  1. 开发效率翻倍——写一次逻辑,跑两种模式。我团队之前做实时大屏和离线报表,两个组各写各的。后来统一到 Flink SQL,一个人就能搞定。
  2. 数据质量有保障——同一套代码,流和批的结果天然对齐。业务方再也不用问“为什么实时和离线数据不一样”了。
  3. 运维省心——一套集群,一套监控,一套告警。我见过最夸张的 Lambda 架构,光维护两套集群就占了运维团队一半的精力。
  4. 资源弹性好——流批共用资源池,白天跑实时,晚上跑批处理。资源利用率能提升 30% 以上。
  5. 架构简洁——少了一层“服务层”的合并逻辑,整个链路更短,故障点更少。

我的建议:如果你现在还在用 Lambda 架构,别急着全量迁移。可以先挑一个业务线试点,比如把某个实时报表和离线报表统一到 Flink SQL 上。跑通了,再逐步推广。我当年就是这么干的,稳得很。

1.5 流批一体核心架构图

下面这张图,是我自己画的一个流批一体核心架构。你可以看到,从数据源到存储层,再到计算引擎和上层应用,全部是统一的。

流批一体核心架构图 流批一体核心架构 数据源层 Kafka 实时流 | 数据库 Binlog | 日志文件 | 离线 HDFS 数据 统一存储层 Hudi / Iceberg / Delta Lake(流批共用表格式) 统一计算引擎层 Flink(流模式 / 批模式) 同一套 SQL / DataStream API,同一套执行计划 服务与调度层 统一元数据 | 统一权限 | 统一调度(实时 + 离线) 应用层 实时大屏 | 离线报表 | 数据服务 API | 自助分析 核心特点 一套架构,两种模式

这张图想表达的核心思想是:从数据摄入到最终输出,每一层都是统一的。存储层用 Hudi 或 Iceberg 这种支持流批读写的表格式,计算层用 Flink 这种原生支持流批一体的引擎。上层应用只管消费数据,不用关心底层是流还是批。

1.6 避坑指南:流批一体不是银弹

最后说点实在的。流批一体虽然好,但不是所有场景都适合。

我曾经犯过的错:有一回,我们想把一个复杂的实时风控系统也改成流批一体。结果发现,风控场景对延迟要求极高(毫秒级),而批处理模式根本满足不了。最后只能把风控单独拎出来,还是用纯流处理。所以,别为了统一而统一。

适合流批一体的场景:

  • 实时报表 + 离线报表(口径统一)
  • 实时数仓 + 离线数仓(数据一致性要求高)
  • 数据中台(需要同时服务实时和离线应用)

不适合的场景:

  • 超低延迟(毫秒级)的实时风控或交易系统
  • 超大规模(PB 级)的纯批处理,且对实时性无要求
  • 已有成熟的 Lambda 架构,且运行稳定,迁移成本过高