1. Flink概述与批流一体概念
1.1 Flink发展历史
Apache Flink 起源于 2010 年柏林工业大学的一个研究项目“Stratosphere”,最初目标是构建一个同时支持批处理和流处理的大数据计算引擎。2014 年,该项目成为 Apache 软件基金会的顶级项目,正式更名为 Apache Flink。此后,Flink 经历了多个重要里程碑:
| 时间 | 里程碑 | 核心意义 |
|---|---|---|
| 2010 | Stratosphere 项目启动 | 奠定批流统一的理论基础 |
| 2014 | 成为 Apache 顶级项目 | 正式命名为 Flink,社区快速壮大 |
| 2015 | Flink 1.0 发布 | 引入 DataStream API,流处理能力成熟 |
| 2019 | Flink 1.9 发布 | 引入批流一体架构(Blink Planner) |
| 2021 | Flink 1.13 发布 | 批流一体正式 GA,统一 Source/Sink 接口 |
| 2023+ | Flink 1.17+ | 批流一体性能优化,特征工程生态成熟 |
关键认知: Flink 的批流一体并非简单的“批处理 + 流处理”拼接,而是从架构层面将批处理视为“有界流”,用同一套运行时引擎处理所有数据场景。
1.2 核心特性
Flink 的核心特性使其在实时计算和特征工程领域占据独特优势:
- 真正的流处理引擎: 每条数据逐条处理,延迟低至毫秒级,支持事件时间(Event Time)语义,保证乱序数据下的准确性。
- 有状态计算: 内置状态后端(State Backend),支持大规模状态管理,适合特征聚合、窗口统计等场景。
- 精确一次语义(Exactly-Once): 通过分布式快照(Checkpoint)机制,保证故障恢复后数据不丢不重。
- 批流一体架构: 同一套 API 编写批处理和流处理作业,代码复用率超过 80%。
- 高吞吐低延迟: 基于内存计算和异步 I/O,单节点吞吐量可达百万条/秒。
- 丰富的生态连接: 原生支持 Kafka、HDFS、HBase、Redis、Elasticsearch 等数据源与目标。
特征工程视角: Flink 的状态管理和事件时间语义,天然适合生成时间窗口特征、滑动聚合特征、序列特征等实时特征,这是传统批处理引擎(如 Spark Batch)难以高效实现的。
1.3 批处理与流处理的统一架构
Flink 批流一体的核心思想是:批处理是流处理的一种特例。批处理的数据集是“有界流”(Bounded Stream),流处理的数据集是“无界流”(Unbounded Stream)。两者在运行时共享同一套执行引擎、调度器和容错机制。
统一架构的核心优势在于:
- 代码复用: 同一套 SQL 或 DataStream API 代码,只需切换执行模式(Streaming / Batch)即可运行在不同数据场景。
- 运维简化: 批作业和流作业共享集群资源、监控体系和运维工具。
- 语义一致: 批处理和流处理使用相同的事件时间语义、状态语义和容错语义,避免“批流两张皮”带来的数据不一致问题。
1.4 Flink在特征工程中的优势
特征工程是机器学习流程中最耗时、最关键的环节。Flink 的批流一体能力为特征工程带来了以下独特价值:
| 特征工程需求 | 传统方案痛点 | Flink 解决方案 |
|---|---|---|
| 实时特征计算 | 需要独立搭建流处理系统,与离线特征割裂 | 批流一体,同一套逻辑同时产出实时和离线特征 |
| 时间窗口特征 | Spark Streaming 微批次延迟高,窗口语义弱 | 原生事件时间窗口,毫秒级延迟,精确语义 |
| 状态聚合特征 | 需要外部存储(Redis)维护状态,复杂度高 | 内置状态后端,支持大规模 Keyed State 管理 |
| 特征回溯补全 | 离线批处理和实时流处理两套代码,容易不一致 | 批流一体,离线回溯直接复用流处理逻辑 |
| 特征数据一致性 | 批流数据口径不一致,模型训练和推理效果差 | Exactly-Once 语义保证特征数据不丢不重 |
常见误区: 很多团队在特征工程中仍然采用“离线 Spark + 实时 Flink”的双引擎架构,导致离线特征和实时特征口径不一致,模型上线后效果下降。Flink 批流一体架构正是解决这一问题的关键方案。