一、流批一体概述

大家好,我是老张。做大数据运维这些年,从 Hadoop 1.x 一路摸爬滚打过来,踩过的坑比写过的代码还多。今天咱们聊聊流批一体——这个听起来高大上、实际上也确实是趋势的概念。

说白了,流批一体就是让一套系统既能处理实时流数据,又能处理离线批量数据。你想想看,以前我们做实时用 Storm、Flink,做离线用 Hive、Spark,两套系统两套代码,运维起来简直要命。我有个项目,凌晨三点被叫起来修实时链路,修完发现离线任务也挂了,因为两套集群共享了同一个 HDFS 目录……嗯,从那以后我就开始认真研究流批一体了。

1.1 流批一体到底是什么?

流批一体,核心就一句话:同一份数据,同一套代码,同一个引擎。不管是秒级延迟的实时流,还是 T+1 的离线批,都用同一套技术栈来处理。

我个人习惯把它拆成三个层面来看:

  • 存储层:流数据和批数据共用同一份存储,比如 Kafka 或 HDFS,避免数据冗余和一致性难题。
  • 计算层:同一个计算引擎(比如 Flink、Spark Structured Streaming)同时支持流和批两种模式,API 统一。
  • 运维层:监控、告警、重试、资源调度,一套体系搞定,不用两套班子来回切换。

核心观点:流批一体不是技术噱头,而是运维效率的刚需。我见过太多团队因为两套系统不一致,导致数据对不上、凌晨加班、互相甩锅。流批一体至少能让你少接一半的告警电话。

1.2 技术演进:从 Lambda 到 Kappa

流批一体不是凭空冒出来的。它的演进路径,说白了就是大数据架构的「减负史」。

1.2.1 Lambda 架构

Lambda 架构是 2011 年由 Nathan Marz 提出的。它的思路很简单:批处理层保证准确性,流处理层保证低延迟。两套代码,两套链路,最后在服务层合并结果。

我在项目中遇到过这样的场景:实时链路用 Flink 算 PV/UV,离线链路用 Hive 跑 T+1 报表。结果每天对账都要吵一架——实时说 100 万,离线说 95 万,谁都不认。最后发现是实时窗口边界和离线分区边界差了 5 分钟。这种问题在 Lambda 架构下几乎无解。

维度 批处理层 流处理层
延迟 小时级/天级 秒级/分钟级
准确性 高(全量重算) 中(可能丢数据)
代码维护 两套代码 两套代码
运维复杂度 高 高

避坑指南:我曾经在 Lambda 架构下踩过一个坑——实时层和批处理层用了不同的序列化方式,导致合并结果时字段顺序错乱。从那以后,我要求团队必须统一数据格式,哪怕多花两天改造时间。

1.2.2 Kappa 架构

Kappa 架构是 Jay Kreps 在 2014 年提出的。它的核心思想是:只用一套流处理引擎,通过重放历史数据来模拟批处理。说白了,批处理就是「把流处理的时间窗口拉长到无限大」。

我个人觉得 Kappa 架构更优雅,但也不是银弹。它要求你的流处理引擎必须支持 exactly-once 语义和状态一致性,否则重放历史数据时数据会乱套。

对比项 Lambda 架构 Kappa 架构
代码量 两套代码 一套代码
运维成本 高(两套链路) 低(一套链路)
数据一致性 难保证 容易保证
历史重算 批处理层直接重算 重放 Kafka 数据
适用场景 对延迟和准确性都有极致要求 能接受秒级延迟的场景

我的建议:如果你的业务对延迟要求不高(比如分钟级),直接上 Kappa 架构。如果必须秒级且数据量极大,Lambda 架构仍然有它的价值。但无论如何,尽量统一引擎,别搞两套。

1.3 流批一体的核心架构图

下面这张图是我自己画的,展示了流批一体在数据流转中的核心位置。你可以看到,无论是实时流还是离线批,最终都汇聚到同一套计算引擎和存储层。

流批一体核心架构图 流批一体核心架构图 实时数据源(Kafka) 离线数据源(HDFS) 统一数据接入层 统一计算引擎 Flink / Spark Structured Streaming 统一存储层 Kafka / HDFS / 对象存储 统一输出(OLAP / 报表 / API) 核心优势: 一套代码 + 一套运维

1.4 适用场景分析

流批一体不是万能的。我见过有人硬要把所有场景都往流批一体上套,结果搞得不伦不类。下面说说我个人的判断标准。

1.4.1 适合流批一体的场景

  • 实时数仓:既需要秒级 OLAP 查询,又需要 T+1 的离线报表。用一套 Flink SQL 搞定,省心。
  • 用户行为分析:实时看用户点击,离线做用户画像。数据源一样,逻辑一样,只是窗口大小不同。
  • 监控告警与历史回溯:实时告警 + 离线趋势分析。我有个项目就是用 Flink 同时跑实时和回溯任务,运维量直接减半。

1.4.2 不适合流批一体的场景

  • 对延迟要求极其苛刻(毫秒级):比如高频交易。流批一体的引擎再快也有状态管理开销,不如专用流引擎。
  • 批处理数据量极大且计算逻辑复杂:比如全量 T+1 的机器学习特征工程。这时候用 Spark 批处理反而更稳。
  • 团队技术栈严重割裂:如果团队一半人只会 Hive,一半人只会 Flink,强行统一只会让两边都痛苦。先做技术培训,再谈架构升级。

总结一下:流批一体解决的是「运维效率」和「数据一致性」的问题,不是「性能极致」的问题。选不选它,先问自己三个问题:

  1. 我现在的两套系统,运维成本是不是已经失控了?
  2. 实时和离线数据对不上的问题,是不是每天都在发生?
  3. 团队有没有能力统一技术栈?

如果三个答案都是「是」,那流批一体就是你的解药。如果有一个「否」,先解决那个问题再动手。

好了,第一章就聊到这儿。流批一体的概念和架构先有个印象,后面我们会深入每个环节的运维细节。记住一句话:架构是骨架,运维是血肉。再好的架构,没有靠谱的运维也是白搭。