一、流批一体概述:数据架构演进、Lambda 与 Kappa 对比、核心价值

大家好,我是这次课程的主讲。做了十几年数据架构,从传统数仓一路摸爬滚打到实时计算,踩过的坑不少。今天咱们先聊聊流批一体到底是怎么回事,它解决了什么问题。

说白了,流批一体不是凭空冒出来的概念。它是数据架构演进到一定阶段的必然产物。你想想看,业务对数据时效性的要求越来越高,传统离线数仓那套 T+1 的模式,在很多场景下已经撑不住了。

1.1 数据架构的演进之路

我刚开始做数据的时候,还是典型的传统数仓架构。那时候数据量不大,业务跑批都在凌晨,第二天出报表就行。架构很简单:ETL 抽数据,分层建模,最后出报表。

后来业务发展快了,老板们开始问:「能不能看到实时的交易数据?」「能不能在用户下单后立刻推荐商品?」这时候传统数仓就有点力不从心了。

于是大家开始尝试两条腿走路:

  • 离线批处理:用 Hive、Spark 跑 T+1 的报表,数据量大,延迟高
  • 实时流处理:用 Storm、Flink 处理秒级数据,延迟低,但计算能力有限

嗯,这里要注意,两条腿走路本身没问题,问题在于这两条路是分开修的,维护成本极高。

核心痛点:同一份业务逻辑,要在批处理和流处理里各写一遍。结果经常对不上,批处理说今天成交 100 万,实时看板显示 95 万,业务方来问「到底哪个是对的?」——这种场景我遇到过不下十次。

1.2 Lambda 架构:一个时代的妥协方案

为了解决实时和离线数据不一致的问题,Nathan Marz 提出了 Lambda 架构。它的核心思路是:

  • 批处理层:处理全量历史数据,保证数据准确性
  • 流处理层:处理实时增量数据,保证低延迟
  • 服务层:合并批和流的结果,对外提供服务

听起来很合理对吧?但我在实际项目中踩过它的坑。

我曾经在一个电商项目中采用 Lambda 架构。批处理层用 Spark,流处理层用 Flink。结果呢?

  • 同一套业务逻辑维护了两份代码,改一个指标要同步改两个作业
  • 批处理和流处理的结果经常对不上,排查问题要查两套链路
  • 服务层的合并逻辑极其复杂,还要处理数据延迟和乱序

最后团队疲于奔命,光是对账就花了一半的精力。

Lambda 架构本质上是一个妥协方案。它承认了批和流是两套系统,然后用服务层去弥合差异。但代价就是架构复杂度翻倍,运维成本飙升。

1.3 Kappa 架构:流处理的一统江湖

后来 Jay Kreps 提出了 Kappa 架构。他的想法很激进:为什么不用一套流处理引擎搞定所有事情?

Kappa 架构的核心思想:

  • 所有数据都走流处理通道
  • 历史数据重放时,从消息队列(如 Kafka)重新消费
  • 批处理只是流处理的一个特例——数据量大的时候,把并行度调高就行了

我个人习惯用一句话概括:Kappa 架构把批处理变成了「慢流处理」。

但 Kappa 架构也有它的局限性。我举个例子:

实际场景:某金融项目需要每天跑全量风控模型,数据量在 TB 级别。如果用 Kappa 架构,需要从 Kafka 重新消费全量数据,耗时数小时。而且 Kafka 的存储成本也不低。

说白了,Kappa 架构更适合数据量可控、历史数据重放频率不高的场景。

1.4 Lambda vs Kappa:一张表说清楚

我整理了一个对比表格,方便你快速理解两者的差异:

对比维度 Lambda 架构 Kappa 架构
处理引擎 批 + 流,两套引擎 一套流引擎
代码维护 两套代码,逻辑重复 一套代码,逻辑统一
数据准确性 批处理保证最终一致 流处理保证精确一次
延迟 流处理低延迟,批处理高延迟 统一低延迟
历史重放 批处理直接读 HDFS 从 Kafka 重新消费
运维复杂度 高,两套系统 低,一套系统
适用场景 数据量大、历史重放频繁 数据量可控、重放不频繁

你可能会问:那到底选哪个?我的建议是:不要非此即彼。现在很多团队在实际落地时,会采用一种混合模式——核心链路用 Kappa,历史重放和全量计算用批处理补充。这就是流批一体的雏形。

1.5 流批一体的核心价值

说了这么多,流批一体到底能带来什么?我总结了三句话:

  • 一套代码,两种语义:同一份业务逻辑,既能跑批也能跑流。改一个指标,不用再同步改两个作业了。
  • 一份数据,统一视图:批处理和流处理共享同一份数据源,结果天然一致。业务方再也不用问「哪个数据是对的」。
  • 一套运维,降低成本:只需要维护一套引擎、一套监控、一套告警。团队从「救火队」变成「建设者」。

我个人的体会:流批一体最大的价值不是技术上的,而是组织上的。它让数据团队从「维护两套系统」的泥潭里解放出来,把精力真正花在业务价值上。说白了,技术是手段,业务才是目的。

下面这张图展示了从传统架构到流批一体的演进路径:

数据架构演进路径 传统数仓 ETL + 离线报表 T+1 延迟 Lambda 架构 批 + 流 两套引擎 维护成本高 Kappa 架构 一套流引擎 历史重放受限 流批一体 一套代码 · 一份数据 · 一套运维 核心价值 降低维护成本 · 保证数据一致性 · 提升开发效率

1.6 流批一体的技术基石

要实现流批一体,光有理念是不够的。需要几个关键的技术支撑:

  • 统一的计算引擎:比如 Flink,它原生支持流处理和批处理,同一套 API 可以跑两种模式
  • 统一的存储层:比如 HDFS 或对象存储,流和批读写同一份数据,避免数据拷贝
  • 统一的元数据管理:这就是我们这门课的核心——数据目录。它让流和批能共享表结构、分区信息、数据血缘
  • 统一的权限和治理:流和批的数据安全策略一致,避免出现「实时数据能看,离线数据不能看」的尴尬

我建议:在落地流批一体时,不要一上来就追求「全量替换」。可以先选一个核心业务场景,比如实时大屏 + 离线报表,用流批一体的方式重构。跑通之后再逐步推广。步子迈大了,容易扯着蛋。