hbase
HBase 的数据模型是怎样的?
一、核心概念概览
HBase 的数据模型是一个稀疏的、分布式的、多维排序表(Sparse, Distributed, Multidimensional, Sorted Map)。
从结构上看:
Table → Row → Column Family → Column Qualifier → Timestamp → Value
可理解为一个五维键值映射:
{Table, RowKey, ColumnFamily, ColumnQualifier, Timestamp} → Value
二、主要组成部分
1. Table(表)
- 类似关系型数据库中的表,但没有固定的 schema(列定义)。
- 不同的表可以存放不同结构的数据。
- 表由多行(Row)组成,每行通过 RowKey 唯一标识。
2. Row(行)
- 每一行有一个RowKey,按字典序(lexicographical order)排序。
- 同一个表中行的 RowKey 是唯一的。
- RowKey 是 HBase 查询的核心,所有查询都要基于 RowKey 或 RowKey 的范围。
3. Column Family(列族)
- 列族是表设计时必须预先定义的部分。
- 一个表可以有多个列族(Column Family)。
- 列族是HBase 物理存储的最小单位,同一列族的数据会一起存放在 HFile 中。
- 每个列族下可以动态增加任意多的列。
例如:
Column Family: info
├── name
├── age
└── address
4. Column Qualifier(列限定符)
- 属于列族下的“具体列名”。
- 列族名 + 列限定符 共同唯一标识一个列。
- 列限定符是动态可变的,HBase 不要求事先定义列。
例如:
info:name
info:email
info:phone
5. Timestamp(时间戳)
- 每个单元格(Cell)都有多个版本的值,用时间戳区分。
- 默认使用系统时间(milliseconds)作为时间戳,也可自定义。
- 可通过列族配置保留版本数(
VERSIONS),例如只保留最新的 3 个版本。
6.type
| Type 值 | 含义 |
|---|---|
| Put | 普通写入(插入/更新) |
| Delete | 删除单个版本 |
| DeleteColumn | 删除整列所有版本 |
| DeleteFamily | 删除整个列族所有版本 |
删除在 HBase 中其实是写入一个带 Delete 标记的 Cell,真正清理发生在 Major Compaction 时。
6. Cell(单元格)
- Cell 是最小的数据存储单元。
- 由
{RowKey, ColumnFamily, ColumnQualifier, Timestamp}唯一确定。 - 存储实际的
Value。
三、数据模型示意
| RowKey | info:name | info:email | score:math | score:english |
|---|---|---|---|---|
| 001 | Alice | a@xx.com | 90 | 85 |
| 002 | Bob | b@xx.com | 78 | 92 |
其中:
- 表名:
students - 列族:
info,score - 列限定符:
name,email,math,english
四、模型特性
| 特性 | 说明 |
|---|---|
| 稀疏性 | 不存在的列不占存储空间(非常适合非结构化数据) |
| 多版本 | 每个单元格可保留多个版本的值 |
| 排序性 | 行按照 RowKey 排序存储 |
| 分布式 | 按 RowKey 范围自动分区(Region)并分布在集群中 |
| 列式存储 | 同一列族的数据物理上存放在一起,便于按列访问 |
五、RowKey 设计建议
RowKey 是 HBase 性能的关键,应避免热点问题:
-
不要使用自增 ID(容易导致 Region 热点)。
-
可使用 Hash 前缀、反转字符串、时间戳倒序 等策略。
-
例:
userID_hash_timestamp -
例:
reverse(phoneNumber)
小结
| 层级 | 作用 | 特点 |
|---|---|---|
| Table | 存储数据的逻辑集合 | 无固定 schema |
| Row | 按 RowKey 唯一标识 | 有序 |
| Column Family | 存储逻辑分组 | 需预定义 |
| Column Qualifier | 具体列名 | 可动态增加 |
| Timestamp | 区分版本 | 支持多版本 |
| Value | 实际数据 | 存储内容 |
Cell 存储示意图
Table
└── RowKey: user1
├── ColumnFamily: info
│ ├── Column: name
│ │ ├── [ts=1730600000000] -> "Alice" ← Cell 1
│ │ └── [ts=1730500000000] -> "Alicia" ← Cell 2
│ └── Column: age
│ └── [ts=1730600000000] -> "20" ← Cell 3
在 HBase 中,Store 是 Region 内部的一个核心组件,用于管理某一列族(Column Family)的所有数据(包括内存中的数据和磁盘上的文件)。它是 HBase 数据存储的基本单元,与列族一一对应,承担着数据缓存、持久化和合并等关键工作。
一、Store 的核心组成
每个 Store 由两部分组成,共同管理一个列族的数据:
-
MemStore(内存缓冲区)
- 数据写入时的临时存储区域,位于内存中。客户端写入的数据会先进入对应列族的 MemStore,积累到一定大小(默认 128MB,可配置)后,会被异步刷写到磁盘,形成 HFile。
- 作用:利用内存的高速读写特性,提升数据写入性能(避免频繁写磁盘)。
-
StoreFile(磁盘文件集合)
- MemStore 刷写后生成的磁盘文件称为 HFile(HBase 底层存储格式),多个 HFile 组成 StoreFile。
- 作用:持久化存储数据,所有 HFile 都存储在 HDFS 上,借助 HDFS 的多副本机制保证可靠性。
二、Store 与其他组件的关系
- 与 Region 的关系:一个 Region 包含多个 Store,每个 Store 对应表中的一个列族。例如,若表
user有两个列族info和address,则该表的每个 Region 中会有两个 Store(info列族的 Store 和address列族的 Store)。 - 与列族的关系:Store 是列族的“物理载体”。HBase 中列族是数据存储的逻辑划分,而 Store 是其对应的物理存储单元(包含该列族的所有数据版本和操作记录)。
三、Store 的核心工作机制
-
数据写入流程
当客户端写入数据到某一列族时:- 数据先被写入该列族对应的 MemStore(同时写入 HLog 保证可靠性)。
- 当 MemStore 达到阈值(或满足其他触发条件,如定时、内存紧张),会触发 刷写(Flush),将数据写入磁盘形成 HFile,加入 StoreFile 集合。
-
数据读取流程
读取某一列族的数据时:- 先检查 MemStore 中是否有目标数据(内存读取速度快)。
- 若未找到,再扫描 StoreFile(HFile)中的数据(磁盘读取)。
- 最终合并 MemStore 和 StoreFile 的结果,返回给客户端。
-
文件合并(Compaction)
随着 MemStore 不断刷写,StoreFile 会产生大量小文件,影响读取效率。Store 会通过两种合并机制优化文件结构:- Minor Compaction:将多个小 HFile 合并为一个较大的 HFile,过程中不删除过期数据(如 TTL 过期、版本数超过限制的数据)。
- Major Compaction:将一个 Store 中所有 HFile 合并为一个大 HFile,同时删除过期数据和标记删除的数据(彻底清理无效数据)。
四、总结
Store 是 HBase 中列族的物理存储单元,每个列族对应一个 Store,内部通过 MemStore(内存缓存)和 StoreFile(磁盘文件)管理数据的读写和持久化。其核心作用是:
- 利用 MemStore 提升写入性能;
- 通过 HFile 实现数据持久化;
- 借助 Compaction 优化存储结构,保证读取效率。
理解 Store 的工作机制,有助于优化 HBase 表设计(如合理规划列族数量)和性能调优(如调整 MemStore 大小、Compaction 策略)。

浙公网安备 33010602011771号