1:数据模型
HBase是一个类似Bigtable的分布式数据库,它是一个稀疏的长期存储的(存储在硬盘上)、多维度的、排序的映射表,这张表的索引
是行关键字、列关键字和时间戳,HBase中的数据都是字符串,没有类型。
用户在表格中存储数据,每一行都有一个可排序的主键和任意多的列。由于是稀疏存储,同一张里面的每一行数据都可以有截然不同的列。
列名字的格式是"<family>:<qualifier>",都是由字符串组成的,每一张表有一个列族集合,这个集合是固定不变的,只能通过改变表结构来改变。
但是qulifier值相对于每一行来说都是可以改变的。
HBase把同一个列族里面的数据存储在同一个目录下,并且HBase的写操作是锁行的,每一行都是一个原子元素,都可以加锁。
HBase所有数据库的更新都有一个时间戳标记,每个更新都是一个新的版本,HBase会保留一定数量的版本,这个值是可以设定的,客户端可以
选择获取距离某个时间点最近的版本单元的值,或者一次获取所有版本单元的值。
2:概念模型
我们可以将一个表想象成一个大的映射关系,通过行健、行健+时间戳或行键+列(列族:列修饰符),就可以定位特定数据,HBase是稀疏存储
数据的,因此某些列可以是空白的,
Row Key | Time Stamp | Column Family:c1 | Column Family:c2 | ||
列 | 值 | 列 | 值 | ||
r1 | t7 | c1:1 | value1-1/1 |
|
|
t6 | c1:2 | value1-1/2 |
|
| |
t5 | c1:3 | value1-1/3 |
|
| |
t4 |
|
| c2:1 | value1-2/1 | |
t3 |
|
| c2:2 | value1-2/2 | |
t2 | t2 | c1:1 | value2-1/1 |
|
|
t1 |
|
| c2:1 | value2-1/1 |
从上表可以看出,test表有r1和r2两行数据,并且c1和c2两个列族,在r1中,列族c1有三条数据,列族c2有两条数据;在r2中,列族c1有一条数据,
列族c2有一条数据,每一条数据对应的时间戳都用数字来表示,编号越大表示数据越旧,反而表示数据越新。
3:物理视图
虽然从概念视图来看每个表格是由很多行组成的,但是在物理存储上面,它是按照列来保存的。
Row Key | Time Stamp | Column Family:c1 | |
列 | 值 | ||
r1 | t7 | c1:1 | value1-1/1 |
t6 | c1:2 | value1-1/2 | |
t5 | c1:3 | value1-1/3 |
表:HBase数据的物理视图(1)
Row Key | Time Stamp | Column Family:c2 | |
列 | 值 | ||
r1 | t4 | c2:1 | value1-2/1 |
t3 | c2:2 | value1-2/2 |
表:HBase数据的物理视图(2
)
需要注意的是,在概念视图上面有些列是空白的,这样的列实际上并不会被存储,当请求这些空白的单元格时,会返回null值。如果在查询的时候不
提供时间戳,那么会返回距离现在最近的那一个版本的数据,因为在存储的时候,数据会按照时间戳来排序。