00 实时数仓维度建模软件架构
HBase、Phoenix、Redis 在实时数仓中的定位与协作关系,聚焦于维度数据的高吞吐持久化与低延迟热点访问两条主线。
flowchart TB
subgraph A[实时数仓计算层]
direction LR
Flink[Flink/Spark Streaming]
App[查询服务/API]
end
subgraph B[维度数据访问层]
direction TB
Redis[("Redis<br>热点维度缓存")]
Phoenix["Phoenix<br>SQL 抽象层"]
end
subgraph C[分布式存储层]
HBase[("HBase<br>海量维度持久化存储")]
end
%% 写入链路
Flink -- "维度数据写入" --> Phoenix
Phoenix -- "SQL → HBase Put" --> HBase
Flink -- "主动预热/更新" --> Redis
%% 查询链路
App -- "1. 查询维度 (SQL)" --> Phoenix
App -- "0. 优先查缓存" --> Redis
Redis -- "缓存命中 (低延迟)" --> App
Redis -- "缓存未命中" --> Phoenix
Phoenix -- "2. 解析SQL并查询" --> HBase
HBase -- "3. 返回维度数据" --> Phoenix
Phoenix -- "4. 回填热点数据" --> Redis
Phoenix -- "5. 返回结果" --> App
%% 样式区分职责
style HBase fill:#f9f,stroke:#333,stroke-width:2px
style Phoenix fill:#bbf,stroke:#333,stroke-width:2px
style Redis fill:#fbb,stroke:#333,stroke-width:2px
style Flink fill:#bfb,stroke:#333,stroke-width:1px
style App fill:#bfb,stroke:#333,stroke-width:1px
图表解读¶
-
HBase(底层持久存储) 负责存储海量、持续增长的维度数据,支持高吞吐写入与随机读取,是维表的唯一真实数据源。
-
Phoenix(SQL 抽象层) 架设在 HBase 之上,提供标准 JDBC/SQL 接口,将 SQL 自动转化为 HBase 的 Get/Put/Scan 操作,大幅简化开发,同时利用二级索引、盐表等特性提升查询效率。
-
在 rowkey 最前面加一个“盐字节”,比如 0~9 或 0~F
-
相同业务数据会被随机分配到不同盐值前缀
- 数据自然打散到多个 Region
-
查询时 Phoenix 会自动并行查多个盐分区,再合并结果
-
Redis(热点缓存) 缓存高频访问的维度数据(如热门商品、活跃用户属性),将关联查询延迟从毫秒级降至亚毫秒级。缓存未命中时自动回源到 Phoenix/HBase,并异步回填。
-
协作流程(读路径)
- 查询服务优先请求 Redis,命中则直接返回(最快路径)。
- 未命中时,通过 Phoenix 以 SQL 查询 HBase。
-
Phoenix 将 HBase 返回的结果集透传给应用,同时可将该数据写入 Redis 设置合理 TTL,后续相同查询即可走缓存。
-
写路径 流处理任务(Flink 等)既可通过 Phoenix 写入 HBase 保证数据一致,也可同时将更新的维度数据主动推入 Redis 完成缓存预热或失效处理。
这种三层协作模式在实时数仓中非常典型:HBase 保证容量与持久化,Phoenix 降低开发复杂度,Redis 消除热点瓶颈,共同支撑起高并发、低延迟的维表关联查询。