一、实时特征计算概述:流批一体、应用场景与技术选型

大家好,我是你们这门课的老朋友。今天咱们聊聊实时特征计算这个事儿。说实话,我刚入行那会儿,批处理和流处理还是两拨人,各玩各的。后来发现,很多场景下你根本分不清数据到底是“流”还是“批”,硬要分开搞,反而把自己绕进去了。

所以,流批一体这个概念就应运而生了。它不是什么玄学,说白了就是:同一套代码,既能处理源源不断的实时数据,也能处理已经落盘的历史数据。你想想看,这多省心。

核心观点:流批一体的本质不是消灭批或流,而是让开发者在逻辑层统一,在物理执行层由引擎自动选择最优策略。

1.1 流批一体到底是个啥?

我记得有一次,一个刚入行的同事问我:“老师,流批一体是不是就是一套代码跑两个地方?”我笑了笑,说:“差不多,但更准确的说法是——同一套逻辑,适应不同的数据节奏。”

咱们用一张图来理解这个事儿:

流批一体核心逻辑 实时数据流 历史数据批 统一计算引擎 统一特征输出 实时推荐 风控决策 实时报表 同一套 SQL / API,既处理 Kafka 实时流,也处理 HDFS 历史分区

你看,不管是实时流还是历史批,最终都汇入同一个计算引擎。我个人习惯把这种架构叫做“逻辑统一、物理分离”。什么意思呢?就是你写代码的时候,不用关心数据是快是慢,引擎会自动帮你搞定。

1.2 实时特征计算的应用场景

聊完了概念,咱们看看这东西到底用在哪儿。我这些年踩过的坑,总结下来就三个典型场景:

  • 实时推荐:用户刚点了一个商品,下一秒推荐系统就得知道他的兴趣偏移。批处理?等跑完用户都走了。
  • 实时风控:我记得有个项目,用户连续输错三次密码,系统必须在 100ms 内判定是否盗号。批处理根本来不及。
  • 实时报表:大屏上的 GMV 曲线,每秒钟都在跳。你总不能说“等明天跑完离线再说”吧?

我的经验:判断一个场景是否适合实时特征计算,就一个问题——这个特征在 1 秒内变化,对业务有没有影响?有,就用实时;没有,批处理更省资源。

1.3 技术选型对比:Flink vs Spark Streaming

好,到了大家最纠结的地方了。选 Flink 还是选 Spark Streaming?我当年也纠结过,后来两个都用了,才摸清楚它们的脾气。

咱们直接上表格,看得清楚:

对比维度 Apache Flink Spark Streaming
处理模型 真正的流处理(每条记录逐条处理) 微批处理(将流切分成小批次)
延迟 毫秒级(事件驱动) 秒级(批次间隔决定)
状态管理 原生支持,内置 RocksDB 状态后端 依赖外部存储(如 Redis)
Exactly-Once 端到端保证(两阶段提交) 需要额外配置(如 Kafka 幂等)
SQL 支持 动态表 + 连续查询 Structured Streaming
批处理能力 流批一体(同一套 API) 批处理强,但流批 API 不统一
社区活跃度 极高(阿里、字节等大厂主导) 高(Databricks 主导)

看到这个表,你可能想问:“那我到底选哪个?”

我个人习惯这样判断:

  • 如果你的场景对延迟敏感(比如风控、实时推荐),选 Flink。它天生就是为流而生,毫秒级延迟不是吹的。
  • 如果你的团队已经重度使用 Spark,且延迟要求不高(秒级可以接受),Spark Streaming 也能用。但要做好心理准备——流批一体在 Spark 里还是有点“拧巴”。

避坑指南:我曾经在一个项目里,为了省事儿,用 Spark Streaming 做实时特征,结果状态管理搞得一团糟。每次重启都要从 Kafka 重放数据,那叫一个痛苦。后来换成 Flink,RocksDB 状态后端一开,世界清净了。

1.4 为什么我推荐 Flink 作为本课程的主线?

嗯,这里我要说点个人偏好了。这门课咱们主要用 Flink,原因有三:

  1. 流批一体是 Flink 的基因,不是后加的补丁。你写一套代码,跑流跑批都行。
  2. 状态管理是实时特征计算的灵魂。Flink 的状态后端、Checkpoint、Savepoint,这些机制让特征计算变得可靠。
  3. 生态成熟。Kafka + Flink + HBase/Redis,这套组合拳在业界已经验证过无数次了。

当然,Spark Streaming 也有它的优势,比如和 MLlib 的集成。但咱们这门课聚焦的是“实时特征计算”,Flink 更对味。

一句话总结:流批一体不是选择题,而是必答题。Flink 给出了目前最好的答案。