3. 离在线存储架构概览
在特征平台中,离线存储与在线存储并不是两套彼此独立的数据库,而是围绕同一份特征定义、面向不同服务目标构建的双通道存储体系。离线存储负责“算得全、算得准、可追溯”,在线存储负责“查得快、延迟低、可高并发”。理解它们的职责边界与协同方式,是后续实现 PIT(Point-in-Time)训练集与在线推理一致性的前提。
一、核心原理:双通道存储的职责划分
特征从原始数据到可用特征,通常经历“写入—加工—物化—服务”四个阶段。离线存储承载历史全量特征与回溯计算,在线存储承载最新特征值与实时查询。二者通过特征物化任务建立同步关系。
- 离线存储职责:保存全量历史特征快照,支持按时间范围扫描、按实体聚合、按事件时间回溯,为训练集生成、特征监控、模型复盘提供数据基础。
- 在线存储职责:保存每个实体最新的特征值,支持毫秒级点查,为线上推理、实时风控、推荐排序提供低延迟特征读取。
- 协同关系:离线计算产出特征后,通过物化任务将最新值写入在线存储;在线存储的写入时间、版本号与离线快照需保持可对齐,才能保证训练与推理一致。
关键结论:离线存储解决“历史可回溯”,在线存储解决“当下可服务”。二者不是主从替代关系,而是同一特征定义在不同时间语义下的两种物化形态。
二、方法流程:从离线计算到在线服务的数据流
典型特征平台的数据流可以概括为:原始数据入湖 → 离线特征计算 → 离线特征表落盘 → 物化同步 → 在线特征库写入 → 在线查询服务。每一步都需要明确时间戳、实体键和特征版本。
-- 离线特征表(示例:用户近7日下单金额)
CREATE TABLE offline_user_feature (
user_id BIGINT,
feature_name STRING,
feature_value DOUBLE,
event_time TIMESTAMP,
dt STRING
) PARTITIONED BY (dt);
-- 在线特征库(示例:Redis Hash 结构)
HSET online_feature:user:10086
user_7d_order_amt 328.50
user_last_login_ts 1717036800
feature_version v20240601
离线计算通常由 Spark、Flink 或 SQL 引擎完成,按天或按小时产出分区快照;物化任务读取最新分区,将每个实体的最新特征值写入在线存储。在线存储常见选择包括 Redis、HBase、Cassandra 或专用特征数据库,要求具备低延迟点查与批量多点查能力。
三、差异对比:离线与在线存储的关键维度
| 对比维度 | 离线存储 | 在线存储 |
|---|---|---|
| 服务目标 | 训练集生成、历史回溯、特征监控 | 线上推理、实时查询、低延迟服务 |
| 数据范围 | 全量历史,按时间分区保存 | 每个实体最新值,通常只保留当前版本 |
| 查询模式 | 范围扫描、聚合、按事件时间回溯 | 点查、批量多点查、毫秒级响应 |
| 延迟要求 | 分钟到小时级 | 毫秒到十毫秒级 |
| 典型引擎 | Hive、Spark、Iceberg、Delta Lake | Redis、HBase、Cassandra、Feature DB |
| 一致性关注点 | 事件时间准确、分区完整、可重算 | 与离线快照对齐、版本可追踪、写入幂等 |
四、案例场景:PIT 训练集与在线推理的一致性
假设某推荐模型需要“用户近7日下单金额”特征。离线侧按天分区保存该特征的历史快照,训练样本在 event_time = 2024-06-01 10:00:00 时,必须读取该时刻之前最近一次物化的特征值,而不是读取 6 月 3 日的最新值。在线侧在推理时读取 Redis 中的当前最新值。若物化任务在 6 月 2 日才把 6 月 1 日的特征写入在线库,而训练集却用了 6 月 3 日的值,就会产生时间穿越,导致离线评估虚高、线上效果下降。
常见误区:把在线存储当作“最新数据源”直接用于训练集拼接,忽略事件时间与物化时间差;或者离线特征表没有保留历史版本,导致无法按 PIT 回溯。正确做法是:离线表保留带 event_time 的历史快照,在线表记录 feature_version 与写入时间,训练集按事件时间对齐离线快照。
五、复盘要点:协同关系中的三个关键控制点
- 时间对齐:离线快照的
event_time与在线写入的write_time必须可比较,PIT 拼接以事件时间为准。 - 版本一致:特征定义变更时,离线表与在线库需同步升级版本号,避免训练与推理使用不同计算逻辑。
- 幂等写入:物化任务重复执行时,在线库写入需保证幂等,防止特征值被旧数据覆盖或重复累加。
实践建议:在特征平台中为每个特征维护“离线表 + 在线表 + 物化任务”三件套元数据,并记录最近一次物化时间与版本号。这样在排查训练/推理不一致时,可以快速定位是离线快照问题、物化延迟问题,还是在线读取问题。
综上,离线存储与在线存储的协同本质是“历史快照”与“最新服务值”之间的受控同步。只有把职责边界、数据流路径和时间语义讲清楚,后续的 PIT 训练集构建与在线特征服务才能建立在一致、可追溯的基础之上。