跳转至

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 消除热点瓶颈,共同支撑起高并发、低延迟的维表关联查询。