名词概念.
Table: 一个Table由众多rows组成, 需要在建表时就决定
Row: 一个row包含row key还有一个或多个columns. Rows以row key按字母从小到大排序, 跟hdfs存储模型一致.
Column: 一个column包含一个column family和一个qualifier, 用:隔开
Column Family: 一个columns的集合和其对应的value值. 与此同时, 每个column family都会有一堆跟存储相关的属性值. 例如值是否需要存储到cache中, 数据如何压缩, row keys如何编码等. 每个row都有相同的column family, 但是有可能该family是空的.
Column Qualifier: column qualifer可以理解为对column family的索引. 但是column family需要再创建table时确定. 而qualifier可以在有需要的时候动态添加. 所以每个的column qualifier可以有很大差别.
由于HBase并不提供记录column信息的meta table, 所以使用者必须自己管理和记住使用过的column的信息.
Cell: 一个完整的cell是由row, column family和column qualifier和value和timestamp组合而成, 代表了cell的其中一个版本.
Timestamp: timestamp陪同value在写入时被添加. 默认情况下, timestamp都是唯一的. 它的实际意义是, 这个data的写入时间. 不过也可以人为设定timestamp
Namespace: 可以理解为对table进行分组管理的这么一个用途. 这是为了后续版本添加新功能而准备的一个新概念. 具体在hbase shell中的使用方式如下:
#Create a namespace
create_namespace 'my_ns'
#create my_table in my_ns namespace
create 'my_ns:my_table', 'fam'
#drop namespace
drop_namespace 'my_ns'
#alter namespace
alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
在使用者不定义任何namespace的情况下, hbase有两种预先准备好的namespace:
1. hbase-system namespace, 是用来存放HBase的内部tables, 例如meta table
2. default-table namespace, 就是使用者没人指定namespace下的默认table.
作为例子, 设计一个table, 记录学生的基本信息, 还有班级信息, 例如学号和所在年级.
设计如下:
1. table名字
2. 每个学生的名字作为row key
3. 基本信息和班级信息分别column family, 各自为"Info"和"Class"
4. 而具体的基本信息和班级信息作为qualifier, 根据需要的时候添加. 而这里, 基本信息的qualifer, 设计成性别和年龄; 班级信息的qualifier, 设计成学号和年级
最后, 结构上如下图:
而实际的物理存储模型应该是:
rowkey先按照字母升序排序, 然后column family升序排序, 然后qualifier升序排序, 然后timestamp降序排序. value不参与排序
所以会有以上物理存储的模型,
一个cell有很多个version的话, 会出现rowkey, column family和qualifier相同, 但是timestamp不同的情况,