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(结果输出)。下面通过架构图展示其整体流程。

Flink 作业三阶段架构图 Flink 实时特征生产作业三阶段 Source(数据源) Transformation(转换) Sink(结果输出) Kafka Pulsar Socket Map/Filter KeyBy/Window ProcessFunction Redis Kafka HBase Source 负责接入数据;Transformation 执行特征计算逻辑;Sink 将特征结果写入在线存储 (Redis / Kafka / HBase),供模型 Serving 阶段实时读取。

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 对原始日志进行字段提取、格式转换、特征值归一化
dataStream.map(log -> extractFeatures(log))
KeyBy 按用户 ID 或物品 ID 分组,为后续窗口聚合做准备
dataStream.keyBy(event -> event.getUserId())
Window 滑动窗口计算过去 5 分钟点击率、过去 1 小时购买次数
keyedStream.window(SlidingProcessingTimeWindows.of(Time.minutes(5), Time.minutes(1)))
ProcessFunction 自定义状态管理,实现用户画像实时更新、序列特征拼接
keyedStream.process(new KeyedProcessFunction<String, Event, Feature>() { ... })
Interval Join 实时关联用户行为流与用户画像流,生成宽表特征
behaviorStream.intervalJoin(profileStream).between(Time.minutes(-5), Time.minutes(5))
实战技巧: 在特征生产中,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 的端到端链路。

Flink 特征生产端到端数据流 Flink 特征生产端到端数据流 Kafka Source 用户行为日志 Transformation KeyBy → Window → Process 滑动窗口聚合 + 状态更新 Redis Sink 特征哈希表 模型 Serving 在线推理 端到端特征生产流程说明 1. Kafka Source 消费用户行为日志(如点击、购买、浏览)。 2. Transformation 阶段按用户 ID 分组,使用滑动窗口计算过去 5 分钟点击率、 过去 1 小时购买次数等特征,并通过 KeyedProcessFunction 更新用户状态。 3. Redis Sink 将特征结果写入 Redis 哈希表,模型 Serving 阶段通过 Key 直接读取。

4.7 本章小结

  • Flink 的逐条处理模型和原生状态管理使其在实时特征生产中优于 Spark Streaming。
  • Flink 作业三阶段(Source、Transformation、Sink)构成了特征生产的完整链路。
  • Source 负责数据接入,Transformation 负责特征计算,Sink 负责结果输出。
  • 在实战中,合理选择 Source 类型、优化 Transformation 逻辑、配置高性能 Sink,是保障特征生产链路低延迟、高可用的关键。