2. 实时特征流基础:特征流的概念、实时特征与离线特征的区别、典型实时特征计算场景
2.1 特征流的概念
特征流(Feature Stream)是指以连续、无界、有序的方式到达的特征数据序列。在实时机器学习系统中,特征流是连接原始数据与在线推理引擎的核心管道。与传统的批量特征处理不同,特征流强调数据到达即处理,每个事件或记录在到达后立即被转换为可用于模型推理的特征向量。
核心特征:特征流具有三个关键属性——时效性(特征在窗口内有效)、连续性(数据持续到达)、顺序性(事件按时间戳排序)。
特征流在架构上通常包含以下组件:
- 数据源接入层:Kafka、Pulsar、Kinesis 等消息队列,负责接收原始事件流。
- 特征计算引擎:Flink、Spark Streaming、Bytewax 等流处理框架,执行窗口聚合、滑动计数、状态管理。
- 特征存储/缓存:Redis、Memcached、FAISS 等低延迟存储,用于特征共享与实时查询。
- 特征输出层:将计算后的特征向量推送至模型推理服务或特征日志。
2.2 实时特征与离线特征的区别
实时特征与离线特征在计算时机、数据范围、存储介质和一致性要求上存在本质差异。下表从多个维度进行对比:
| 对比维度 | 离线特征 | 实时特征 |
|---|---|---|
| 计算时机 | T+1 或周期性批量调度(如每日凌晨) | 事件到达即触发,毫秒级响应 |
| 数据范围 | 全量历史数据(可回溯数年) | 滑动窗口内数据(通常数分钟至数小时) |
| 存储介质 | HDFS、Hive、Parquet 等离线数仓 | Redis、内存状态、在线 KV 存储 |
| 一致性要求 | 强一致性,支持重跑和校验 | 最终一致性,允许少量乱序和延迟 |
| 特征时效性 | 固定快照,不可变 | 持续更新,随时间衰减 |
| 计算复杂度 | 可执行复杂 JOIN、多层嵌套 UDF | 轻量级聚合、预计算、近似算法 |
| 典型框架 | Spark SQL、Hive、MapReduce | Flink、Kafka Streams、Bytewax |
实践建议:在实时特征流中,应避免使用离线特征中的全量 JOIN 操作。推荐采用预关联宽表或维表缓存策略,将关联操作转化为 KV 查询,以降低延迟。
2.3 典型实时特征计算场景
实时特征计算在工业界有广泛的应用场景,以下列举三个最具代表性的模式:
2.3.1 滑动窗口聚合特征
最常见的实时特征类型,用于统计用户在最近一段时间窗口内的行为计数、金额总和、均值等。例如:
- 近 5 分钟点击次数:统计用户最近 5 分钟内的点击事件数。
- 近 1 小时交易总额:统计用户最近 1 小时内的交易金额总和。
- 近 30 分钟页面停留时长均值:统计用户最近 30 分钟内每次页面停留时长的平均值。
-- Flink SQL 示例:近 5 分钟点击次数
CREATE VIEW recent_clicks AS
SELECT
user_id,
COUNT(*) AS click_count_5min
FROM click_events
GROUP BY
user_id,
HOP(ts, INTERVAL '1' MINUTE, INTERVAL '5' MINUTE);
2.3.2 序列行为特征
基于事件顺序提取的模式特征,常用于欺诈检测和推荐系统:
- 行为路径特征:用户最近 10 次操作的事件类型序列(如:浏览→加购→支付)。
- 时间间隔特征:相邻两次行为之间的时间差,用于识别异常快速操作。
- 状态转移特征:从当前状态到下一状态的转移概率,如“浏览→加购”的转化率。
2.3.3 实时交叉特征
将多个实时特征进行组合,产生更高阶的语义特征:
- 用户-商品交叉:用户近 1 小时对该商品的浏览次数 × 商品近 1 小时被收藏次数。
- 设备-地域交叉:同一设备 ID 在最近 10 分钟内出现在不同地域的数量。
- 频次-金额交叉:用户近 5 分钟交易频次 × 近 5 分钟平均交易金额。
注意:实时特征计算中,窗口边界对齐和水位线(Watermark)设置是常见难点。窗口划分不当会导致特征偏移,水位线设置过紧会丢失延迟数据,过松则增加特征延迟。建议在开发阶段使用回放验证机制对比实时特征与离线特征的一致性。
2.4 实时特征流的关键设计原则
- 幂等性:同一事件被重复处理时,特征结果应保持一致。
- 状态可恢复:流处理任务失败重启后,能从 Checkpoint 恢复状态,不丢失窗口数据。
- 特征时效性分级:将特征按延迟要求分为毫秒级、秒级、分钟级,分别采用不同的计算链路。
- 特征血缘追踪:记录每个实时特征的数据来源、计算逻辑和版本,便于问题排查。
- 降级与熔断:当特征存储或下游服务不可用时,应具备降级策略(如返回默认值),避免阻塞主流程。