3、特征存储架构:在线存储选型、离线存储选型与冷热分层
特征存储的架构设计,说白了就是解决两个问题:特征怎么存,以及特征怎么取。在线场景要毫秒级响应,离线场景要扛得住海量数据扫描。这两套逻辑完全不同,硬塞在一起只会两头不讨好。
我刚开始做特征平台时,犯过一个低级错误——把特征全塞进 Redis,觉得“快就完事了”。结果离线回溯时 Redis 直接被打挂,运维同事半夜打电话让我起来救火。嗯,从那以后我学乖了:在线离线必须分离,冷热数据必须分层。
3.1 在线存储选型:Redis vs HBase
在线存储的核心诉求就三个:低延迟、高并发、高可用。特征推理时,模型需要在几十毫秒内拿到用户特征,扛不住任何慢查询。
3.1.1 Redis:缓存之王,但不是万能药
Redis 的优势不用我多说了——纯内存操作,单机 QPS 能到 10 万+。在特征平台里,Redis 最适合存实时特征和高频访问的离线特征。
但 Redis 有个硬伤:内存太贵。你想想看,一个特征平台动辄几百亿条特征,全放内存?老板会找你谈话的。另外 Redis 的持久化能力偏弱,RDB 和 AOF 都有丢数据的风险。
3.1.2 HBase:海量存储,延迟可控
HBase 是另一种思路——基于 HDFS 的列式存储,能存下 PB 级数据。它的读写延迟在毫秒到几十毫秒之间,虽然不如 Redis 快,但胜在容量大、成本低。
HBase 的 RowKey 设计是关键。我在项目中踩过一个坑:RowKey 设计成 user_id + feature_name 的拼接,结果热点用户全挤在同一个 Region Server 上,读性能直接崩了。后来改成 user_id 的哈希前缀 + 时间戳倒序,才把负载打散。
| 对比维度 | Redis | HBase |
|---|---|---|
| 延迟 | < 1ms | 5-50ms |
| 容量 | GB ~ TB(受内存限制) | PB 级 |
| 成本 | 高(纯内存) | 低(基于 HDFS) |
| 持久化 | 弱(RDB/AOF 有丢数据风险) | 强(WAL + HDFS 三副本) |
| 适用场景 | 实时特征、热点特征 | 全量离线特征、回溯特征 |
3.1.3 在线存储的混合策略
我个人习惯用多级缓存的方案:
- L1 缓存:本地进程内缓存(Caffeine/Guava),扛住 80% 的重复查询
- L2 缓存:Redis 集群,存实时特征和热点特征
- L3 存储:HBase,存全量离线特征,作为兜底
这样既能保证延迟,又能控制成本。我曾经在一个广告推荐项目里用这套方案,把 Redis 的内存占用从 500GB 降到了 80GB,效果很明显。
3.2 离线存储选型:Hive vs Delta Lake
离线存储面向的是批量特征计算和特征回溯。场景不同,选型逻辑也不同。
3.2.1 Hive:成熟稳定,但慢
Hive 是离线数仓的老牌选手。它的优点是生态成熟、SQL 支持好,几乎所有的数据工程师都会用。但 Hive 的痛点也很明显:写入慢、不支持 ACID 事务、小文件问题严重。
我记得有一次做特征回溯,需要更新 3 个月的历史特征。Hive 不支持 UPDATE,只能全量覆盖重写,一次回溯跑了 6 个小时。后来换成 Delta Lake,同样的逻辑只用了 40 分钟。
3.2.2 Delta Lake:湖仓一体,支持 ACID
Delta Lake 是 Databricks 推出的存储层,基于 Parquet 格式,支持ACID 事务、时间旅行、Schema 演进。这些能力对特征平台来说太重要了。
- ACID 事务:多任务并发写特征时不会互相覆盖
- 时间旅行:可以回溯到任意时间点的特征快照
- Schema 演进:新增特征字段时不需要重写全表
3.3 冷热分层:省钱的关键
特征数据有明显的时间衰减特性。昨天的特征可能被频繁访问,但 3 个月前的特征几乎没人查。如果不做冷热分层,存储成本会直线上升。
3.3.1 分层策略
我一般把特征数据分成三层:
| 层级 | 时间范围 | 存储介质 | 访问频率 | 压缩策略 |
|---|---|---|---|---|
| 热层 | 最近 7 天 | Redis + SSD | 高(毫秒级) | 无压缩 |
| 温层 | 7 天 ~ 3 个月 | HBase / Delta Lake | 中(秒级) | Snappy 压缩 |
| 冷层 | 3 个月以上 | HDFS / S3(归档) | 低(分钟级) | Zstd 高压缩比 |
3.3.2 数据迁移策略
冷热分层不只是存储选型,还要考虑数据迁移。我常用的方案是:
- 定时任务:每天凌晨跑一个 Spark 任务,把 7 天前的特征从热层搬到温层
- 生命周期管理:Delta Lake 支持自动清理过期数据,设置 retention 为 90 天即可
- 归档策略:3 个月以上的数据压缩后归档到 S3 或 HDFS,只保留元数据索引
3.4 整体架构图
下面这张图展示了特征存储的完整架构。你可以看到在线存储、离线存储和冷热分层是如何协同工作的。
3.5 选型决策树
最后,我总结了一个简单的选型决策树,帮你快速判断该用哪种存储:
- 需要毫秒级响应? → 选 Redis(配合本地缓存)
- 需要存 PB 级特征? → 选 HBase 或 Delta Lake
- 需要 ACID 事务? → 选 Delta Lake(别犹豫)
- 成本敏感? → 做冷热分层,冷数据归档到 S3/HDFS
- 团队 Hive 生态成熟? → 逐步迁移到 Delta Lake,别一刀切