HBase逻辑存储模型之名词解释。
1.HBase逻辑存储模型之名词解释

详细解释:
- 命名空间(Namespace):命名空间类似于MySQL中的Database。
- 表(Table):表类似于MySQL中的Table。
- 行(Row):行类似于MySQL中的行。
- 行键(Rowkey):行键类似于MySQL中的主键。在MySQL中,主键不是必须的。在HBase中,行键在每一行中是必须存在的。HBase号称上亿条数据可以实现毫秒级查询,其实是需要根据Rowkey查询的,如果涉及其它列的组合查询,查询效率也一般。
- 列族(ColumnFamily):列族在MySQL中没有对应的概念。在HBase中,列族是一批列的集合,在创建表的时候,列族必须定义。
- 列(Column):列类似于在MySQL中的列。在HBase中创建表的时候,列不需要提前定义,也不能提前定义,后期在向表中添加数据的时候,动态指定列。
- 时间戳(Timestamp ):默认插入值的时候会带有时间戳,是HBase自带的,不需要在表定义的时候指定。时间戳和值是一 一对应的,时间戳的类型是 64 位整型。时间戳可以由 HBase (在数据写入时)自动赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由用户显式赋值,针对某个列,不同版本的数据按照时间戳倒序排序,即最新的数据排在最前面。HBase 在查询的时候,默认返回列中最新版本的数据。
- 数据类型( DataType ):MySQL中,数据类型多种多样,常见的有int、varchar、date、datetime等等。在HBase中,数据类型只有一种,就是byte[](字节数组),不管是什么数据类型,在HBase中存储的时候统一都会转化为byte[]。
2.逻辑存储模型

这个图的意思表示在HBase中有一张表,表里面有2个列族,c1和c2,目前这个表里面有1条数据,这条数据的RowKey就是:隔壁老王。其中列族c1里面只有1列,是age,列族c2里面有2列,car和house针对列族c1中的age列的值而言,有4个历史版本:T1,T2,T3,T5。
想要定位某一列的值,流程是这样的:HBase Table --> RowKey --> ColumnFamily --> Column --> TimeStamp
想要达到图中这个数据效果,需要对表执行以下这些步骤:
- 向HBase表中添加数据,指定RowKey 为隔壁老王,指定列族c1中的age列,值为27,此时这一列的值会对应的产生一个时间戳 T1,表示数据的产生时间
- 向HBase表中添加数据,指定RowKey 为隔壁老王,指定列族c1中的age列,值为28,此时这一列的值会对应的产生一个时间戳 T2
- 向HBase表中添加数据,指定RowKey 为隔壁老王,指定列族c1中的age列,值为29,此时这一列的值会对应的产生一个时间戳 T3
- 向HBase表中添加数据,指定RowKey 为隔壁老王,指定列族c2中的car列,值为有车,此时这一列的值会对应的产生一个时间戳 T4
- 向HBase表中添加数据,指定RowKey 为隔壁老王,指定列族c1中的age列,值为30,此时这一列的值会对应的产生一个时间戳 T5
- 向HBase表中添加数据,指定RowKey 为隔壁老王,指定列族c2中的house列,值为有房,此时这一列的值会对应的产生一个时间戳 T6
- 向HBase表中添加数据,指定RowKey 为隔壁老王,指定列族c2中的car列,值为没车(老王把车卖了),此时这一列的值会对应的产生一个时间戳 T7
经过这7步之后,数据就可以达到和图中一样的效果了。
HBase是 三维(三个维度) 有序存储的,是指Rowkey,Column key(Column Family和Column)和 TimeStamp 这三个维度是依照ASCII码表排序的。
先按Rowkey升序排序。Rowkey相同则按Column key升序排序。Rowkey、Column key相同则按Timestamp降序排序。如下图所示:

这个图里面表示对HBase的表t1进行全表扫描,在扫描的时候会返回同一个列的最多2个历史版本数据(VERSIONS=>2)。
图中执行scan 't1',{VERSION=>2}(全表扫描) 命令之后,最终返回了3条数据,Rowkey是:stu001,stu002,stu003。
针对第1条数据stu001,它里面一共有3列:age,name、math。列族有2个:info和level。age和name属于info列族,math属于level列族。
这里的info:age显示了两次是因为age字段存储了2个历史版本的数据。
最终从这个图里面是可以看出来HBase的三维有序存储特性的。
首先按照Rowkey(stu001,stu002,stu003)升序排序,相同Rowkey(stu001)内按照Column key(info:age,info:name,level:math)升序排序,针对相同的Column key(info:age),则按照数据对应的Timestamp(1800690940131,1800690940039)降序排序。