4、实时流处理引擎:Flink与Spark Streaming对比、Flink在特征生产中的优势、Flink作业基本概念(Source、Transformation、Sink)
在实时特征生产链路中,流处理引擎是核心基础设施。当前工业界最主流的两个引擎是 Apache Flink 和 Apache Spark Streaming。本章从架构模型、延迟保证、状态管理、特征生产适用性四个维度进行对比,并深入解析 Flink 在特征生产场景中的关键优势及其作业基本概念。
4.1 Flink vs Spark Streaming:核心对比
| 对比维度 | Apache Flink | Spark Streaming |
|---|---|---|
| 运行时模型 | 真正的逐条流处理(DataStream API),每条记录到达即处理 | 微批次(Micro-Batch)模型,将流切分为固定间隔的 RDD 批次 |
| 延迟 | 亚秒级(毫秒级延迟),适合实时特征计算 | 秒级(批次间隔决定,通常 1~10 秒),延迟较高 |
| 状态管理 | 原生支持 Keyed State、Operator State,支持大状态 RocksDB 后端 | 依赖外部存储(Redis/HBase)或 updateStateByKey,状态规模受限 |
| 事件时间语义 | 原生支持事件时间、水位线(Watermark)、乱序处理 | 事件时间支持较弱,乱序处理依赖窗口延迟触发 |
| 精确一次语义 | 端到端精确一次(Checkpoint + 两阶段提交 Sink) | 输出端精确一次需配合事务性 Sink,实现复杂度高 |
| 特征生产适用性 | 非常适合:滑动窗口聚合、CROSS JOIN 实时标签、多流关联 | 适合:T+0 离线特征批改、分钟级特征刷新 |
关键结论: 在特征生产场景中,Flink 的逐条处理模型和原生状态管理使其成为实时特征计算的首选引擎。Spark Streaming 更适合准实时或与 Spark 生态深度绑定的场景。
4.2 Flink 在特征生产中的核心优势
- 真正的流式架构: 数据到达即处理,无需等待批次边界,特征延迟从秒级降至毫秒级,满足模型在线推理的时效性要求。
- 强大的状态后端: 支持 RocksDB 状态后端,可存储 GB 到 TB 级别的特征状态(如用户最近 30 天行为序列),且支持增量 Checkpoint,故障恢复快。
- 精确的时间语义: 事件时间 + 水位线机制,能正确处理乱序到达的埋点数据,保证滑动窗口特征(如过去 5 分钟点击率)的准确性。
- 多流关联能力: 原生支持 Interval Join、Regular Join、Window Join,可实时关联用户画像流、行为流、物品属性流,生成宽表特征。
- 端到端一致性: 通过 Checkpoint 和两阶段提交 Sink,保证特征数据不丢不重,避免模型训练和推理时的特征偏移。
实战建议: 在特征生产链路中,优先使用 Flink 的 KeyedProcessFunction 实现自定义滑动窗口聚合,配合 RocksDB 状态后端存储用户画像状态,可支撑百万级 QPS 的实时特征计算。
4.3 Flink 作业基本概念:Source、Transformation、Sink
一个完整的 Flink 实时特征生产作业由三个核心阶段构成:Source(数据源) → Transformation(转换计算) → Sink(结果输出)。下面通过架构图展示其整体流程。
4.4 Source:数据接入层
Source 是 Flink 作业的入口,负责从外部系统读取数据流。在特征生产场景中,常见的 Source 类型包括:
- Kafka Source: 最常用的消息队列 Source,支持从 Kafka Topic 中消费用户行为日志、实时特征中间结果。
- Pulsar Source: 低延迟消息队列,适合对延迟要求极高的特征生产场景。
- File Source: 读取 HDFS/S3 上的文件,适用于离线特征批改或模型回补场景。
- 自定义 Source: 通过实现
SourceFunction接口,接入自研数据管道或 RPC 服务。
注意: 在特征生产中,Kafka Source 必须配置 事件时间提取器 和 水位线生成策略,否则滑动窗口特征会因乱序数据产生偏差。
4.5 Transformation:特征计算核心
Transformation 是 Flink 作业的核心逻辑层,所有特征计算都在此阶段完成。常见的特征计算 Transformation 包括:
| Transformation 类型 | 特征生产场景示例 | 代码片段 |
|---|---|---|
| Map / FlatMap | 对原始日志进行字段提取、格式转换、特征值归一化 | |
| KeyBy | 按用户 ID 或物品 ID 分组,为后续窗口聚合做准备 | |
| Window | 滑动窗口计算过去 5 分钟点击率、过去 1 小时购买次数 | |
| ProcessFunction | 自定义状态管理,实现用户画像实时更新、序列特征拼接 | |
| Interval Join | 实时关联用户行为流与用户画像流,生成宽表特征 | |
实战技巧: 在特征生产中,KeyedProcessFunction 是最灵活的 Transformation,它允许你管理 Keyed State(如 ValueState、ListState、MapState),实现复杂的特征逻辑,如用户行为序列拼接、实时统计量更新等。
4.6 Sink:特征结果输出
Sink 是 Flink 作业的出口,负责将计算好的特征结果写入外部存储系统,供模型 Serving 阶段实时读取。常见的 Sink 类型包括:
- Redis Sink: 将特征写入 Redis 哈希表或字符串,支持高并发读取,适合在线推理场景。
- Kafka Sink: 将特征结果写回 Kafka Topic,供下游特征管道或模型服务消费。
- HBase Sink: 将特征写入 HBase 宽表,适合存储大规模用户画像特征。
- JDBC Sink: 将特征写入 MySQL/PostgreSQL,适用于特征回填或离线分析。
下面通过第二个 SVG 图展示 Flink 作业在特征生产中的完整数据流,从 Source 到 Sink 的端到端链路。
4.7 本章小结
- Flink 的逐条处理模型和原生状态管理使其在实时特征生产中优于 Spark Streaming。
- Flink 作业三阶段(Source、Transformation、Sink)构成了特征生产的完整链路。
- Source 负责数据接入,Transformation 负责特征计算,Sink 负责结果输出。
- 在实战中,合理选择 Source 类型、优化 Transformation 逻辑、配置高性能 Sink,是保障特征生产链路低延迟、高可用的关键。