3、特征存储架构:在线存储选型、离线存储选型与冷热分层

特征存储的架构设计,说白了就是解决两个问题:特征怎么存,以及特征怎么取。在线场景要毫秒级响应,离线场景要扛得住海量数据扫描。这两套逻辑完全不同,硬塞在一起只会两头不讨好。

我刚开始做特征平台时,犯过一个低级错误——把特征全塞进 Redis,觉得“快就完事了”。结果离线回溯时 Redis 直接被打挂,运维同事半夜打电话让我起来救火。嗯,从那以后我学乖了:在线离线必须分离,冷热数据必须分层。

3.1 在线存储选型:Redis vs HBase

在线存储的核心诉求就三个:低延迟、高并发、高可用。特征推理时,模型需要在几十毫秒内拿到用户特征,扛不住任何慢查询。

3.1.1 Redis:缓存之王,但不是万能药

Redis 的优势不用我多说了——纯内存操作,单机 QPS 能到 10 万+。在特征平台里,Redis 最适合存实时特征和高频访问的离线特征。

但 Redis 有个硬伤:内存太贵。你想想看,一个特征平台动辄几百亿条特征,全放内存?老板会找你谈话的。另外 Redis 的持久化能力偏弱,RDB 和 AOF 都有丢数据的风险。

我的经验:Redis 只放 T+0 的实时特征和 Top 10% 的热点离线特征。冷数据别往里塞,性价比太低。

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 在线存储的混合策略

我个人习惯用多级缓存的方案:

  1. L1 缓存:本地进程内缓存(Caffeine/Guava),扛住 80% 的重复查询
  2. L2 缓存:Redis 集群,存实时特征和热点特征
  3. 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 演进:新增特征字段时不需要重写全表
核心建议:新项目直接上 Delta Lake 或 Iceberg。Hive 虽然稳定,但已经跟不上特征平台的需求了。如果你还在用 Hive,建议尽快迁移。

3.3 冷热分层:省钱的关键

特征数据有明显的时间衰减特性。昨天的特征可能被频繁访问,但 3 个月前的特征几乎没人查。如果不做冷热分层,存储成本会直线上升。

3.3.1 分层策略

我一般把特征数据分成三层:

层级 时间范围 存储介质 访问频率 压缩策略
热层 最近 7 天 Redis + SSD 高(毫秒级) 无压缩
温层 7 天 ~ 3 个月 HBase / Delta Lake 中(秒级) Snappy 压缩
冷层 3 个月以上 HDFS / S3(归档) 低(分钟级) Zstd 高压缩比

3.3.2 数据迁移策略

冷热分层不只是存储选型,还要考虑数据迁移。我常用的方案是:

  1. 定时任务:每天凌晨跑一个 Spark 任务,把 7 天前的特征从热层搬到温层
  2. 生命周期管理:Delta Lake 支持自动清理过期数据,设置 retention 为 90 天即可
  3. 归档策略:3 个月以上的数据压缩后归档到 S3 或 HDFS,只保留元数据索引
避坑指南:我曾经在冷热分层时忽略了一个问题——特征回溯需要跨层查询。用户要查 6 个月前的特征,结果冷层数据还没解压,查询超时了。后来我加了一层冷数据预加载机制,回溯任务启动时提前把冷层数据解压到温层,才解决了这个问题。

3.4 整体架构图

下面这张图展示了特征存储的完整架构。你可以看到在线存储、离线存储和冷热分层是如何协同工作的。

特征存储架构:在线/离线/冷热分层 在线存储层 L1: 本地缓存 Caffeine / Guava L2: Redis 集群 实时特征 + 热点 L3: HBase 全量离线特征 离线存储层 Delta Lake ACID / 时间旅行 Hive 存量迁移中 Spark 批处理 特征计算 / 回溯 冷热分层策略 热层(最近 7 天) Redis + SSD 毫秒级访问,无压缩 温层(7 天 ~ 3 个月) HBase / Delta Lake 秒级访问,Snappy 压缩 冷层(3 个月以上) HDFS / S3 归档 分钟级访问,Zstd 压缩 每日迁移 90 天归档 💡 核心原则:在线存储追求低延迟,离线存储追求高吞吐,冷热分层控制成本 三者协同,才能支撑起一个高效、稳定、低成本的特征平台

3.5 选型决策树

最后,我总结了一个简单的选型决策树,帮你快速判断该用哪种存储:

  • 需要毫秒级响应? → 选 Redis(配合本地缓存)
  • 需要存 PB 级特征? → 选 HBase 或 Delta Lake
  • 需要 ACID 事务? → 选 Delta Lake(别犹豫)
  • 成本敏感? → 做冷热分层,冷数据归档到 S3/HDFS
  • 团队 Hive 生态成熟? → 逐步迁移到 Delta Lake,别一刀切
一句话总结:没有银弹。在线存储、离线存储、冷热分层是三个独立维度,需要根据业务场景组合使用。我见过太多团队在选型上钻牛角尖,其实混合架构才是特征平台的常态。