HBase 数据模型
HBase 的数据模型基于面向列的存储架构,采用行键(RowKey)、列族(Column Family)、列限定符(Column Qualifier)和时间戳的层次结构。
-
行键(RowKey):唯一标识表中的一行数据,所有行根据行键的字典顺序进行存储。
RowKey 类似于 MySQL 中的 Primary Key,但在 HBase 中更为重要。每行数据必须包含一个 RowKey。
-
列族(Column Family):将表中的数据列进行逻辑分组。每个列族包含若干个列限定符,列族在创建表时定义,不能轻易更改。
-
列限定符(Column Qualifier):每个列族包含多个列限定符,可以动态添加,列限定符与列族一起确定具体的数据单元。
-
单元格(Cell):由行键、列族和列限定符共同确定的最小存储单元。
-
时间戳(Timestamp):HBase 中的每个单元格可以保存同一数据的多个版本,版本通过时间戳区分。
在 HBase 中,数据存储在具有行和列的表中。虽然看起来类似于关系数据库 (RDBMS),但将 HBase 表视为多维 Map 结构更容易理解。
HBase 存储模型表格示例
下表展示了一个 HBase 表的结构:
RowKey | Column Family: personal | Column Family: contact |
---|---|---|
name | age | |
user123 | John Doe | 30 |
user456 | Jane Doe | 25 |
- RowKey:唯一标识每一行用户数据。
- Column Family:
personal
和contact
,分别存储个人信息和联系方式。 - 列限定符:
name
、age
、email
、phone
,表示具体的数据项。 - 单元格:例如,行键为
user123
、列族为personal
、列限定符为name
的单元格存储值John Doe
。 - 时间戳:每个单元格可以有多个版本,但在表格中仅展示最新版本。
数据存储示例
在 HBase 中,数据的存储可以看作是一个多维度的映射结构,如下所示:
RowKey: user123
Column Family: personal
name: John Doe (Timestamp: 1696886600)
age: 30 (Timestamp: 1696886600)
Column Family: contact
email: john@abc.com (Timestamp: 1696886600)
phone: 123-456-7890 (Timestamp: 1696886600)
RowKey: user456
Column Family: personal
name: Jane Doe (Timestamp: 1696886600)
age: 25 (Timestamp: 1696886600)
Column Family: contact
email: jane@xyz.com (Timestamp: 1696886600)
phone: 098-765-4321 (Timestamp: 1696886600)
在这个示例中,每个单元格都有一个时间戳,用于区分不同版本的数据。当更新数据时,新的版本会有不同的时间戳,以保留历史数据。
专业术语
1. 表(Table)
- HBase 中的数据以表的形式组织。
- 表由多个行组成。
2. 行(Row)
- HBase 中的行由一个行键(RowKey)和一个或多个列组成。
- 行按行键的字典顺序存储。
- 行键的设计非常重要,应尽量使相关的行存储在一起。
- 例如,存储网站域名时,可以将域名反转后存储(如 org.apache.www、org.apache.mail)。这样可以将所有 Apache 域存储在一起,而不是根据子域的第一个字母展开。
3. 列(Column)
- HBase 中的列由列族(Column Family)和列限定符(Column Qualifier)组成。
- 列的表示形式为
列族名:列限定符名
,例如C1:USER_ID
。
4. 列族(Column Family)
列族是对一组相关列及其值的逻辑分组,用于优化性能。
- 存储属性:每个列族有一组存储属性,例如是否应缓存在内存中、数据如何压缩以及行键如何编码。
- 相同结构:表中的每一行都有相同的列族结构,但各行在具体列中的数据可能不同。
- 数据存储:所有列族的数据存储在同一位置(文件系统 HDFS)。
- 建议:HBase 官方建议保持列族中的列一致,并将同类数据放在同一个列族中,以便于数据管理和访问。
5. 列限定符(Column Qualifier)
- 列族中包含多个列限定符,为存储的数据提供索引。
- 列族在创建表时是固定的,但列限定符没有限制,可以动态添加。
- 不同的行可能包含不同的列限定符。
6. 单元格(Cell)
- 单元格是行、列族和列限定符的组合。
- 包含一个值和一个时间戳(表示该值的版本)。
- 单元格中的内容是以二进制存储的。
概念模型
在以下概念模型中,示例表具有两行和三个列族(contents、anchor、people),并展示了数据的多个版本:
Row Key | Time Stamp | Column Family: contents | Column Family: anchor | Column Family: people |
---|---|---|---|---|
"com.cnn.www" | t9 | anchor:cssnsi.com = "CNN" | ||
"com.cnn.www" | t8 | anchor:my.look.ca = "CNN.com" | ||
"com.cnn.www" | t6 | contents:html = "..." |
- RowKey:com.cnn.www:唯一标识该行。
- Column Family: anchor:存储链接,包含
anchor:cssnsi.com
和anchor:my.look.ca
。 - Column Family: contents:存储网页内容,包含
contents:html
。 - Time Stamp:
com.cnn.www
在 HBase 中有多个版本的数据(例如 t3、t5、t6、t8、t9),每个版本表示数据在不同时间点的状态。