1.7 HBase的数据模型
HBase的数据模型主要包含以下几个重要概念。
· Name Space(命名空间)。
· Region(区域)。
· Column(列)。
· Column Family(列族)。
· Row(行)。
· Time Stamp(时间戳)。
· Cell(存储单元)。
下面将逐一介绍这些概念以及它们在HBase中的意义。
1.Name Space
Name Space是指对一组表的逻辑分组(类似于关系数据库的数据库概念),以便于对表按业务进行划分。每个命名空间下可以有多个表。HBase从0.98.0、0.95.2两个版本开始支持命名空间级别的授权操作。HBase有两个自带的命名空间,分别是hbase和default。hbase命名空间中存放的是HBase内置的表,default命名空间中存放的是用户使用的默认命名空间的表。
2.Region
Region类似于关系数据库的表的概念。不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列。这意味着,向HBase写入数据时,字段可以动态、按需指定。因此,与关系数据库相比,HBase能更加轻松地应对字段需要变更的应用场合。
HBase中的表一般拥有一个到多个Region。当数据量不多时,一个Region足以存储所有数据。当数据量大时,HBase会拆分Region,并且当HBase在进行负载均衡时,也有可能会从一台RegionServer上把Region移动到另一台RegionServer上。
3.Column
HBase中基本的存储单位是列,一列或者多列形成一行。每列都由列族和列限定符(Column Qualifier)进行限定,例如info:name、info:age。在创建表时,只需指定列族即可,而无须预先定义列限定符。一行可以有3列,而在另一行中可以插入4列数据,也就是说,对于不同的行,列可以完全不一样。
4.Column Family
在HBase中可以插入不同的行数据,其中列族起到了非常重要的作用。在HBase中,一列或者多列可以组成一个列族。用户在创建表时不需要指定列,因为列是可以改变的,需要指定的是列族。一个表有几个列族是一开始就指定好了的。列必须依赖列族而存在,一个没有列族的表是没有意义的。不过官方的建议是:一个表中不可有太多的列族,列族越少越好。在HBase中一个列的名称前面总是带着它所属的列族,列名称的规范格式为“列族:列名”,比如info1:age、info1:name、info2:age、info2:name。列族具有如下几个特点:
(1)列族必须在创建表的时候定义。
(2)给表指定了列族之后无法再修改。
(3)每个列族中的列数是没有限制的。
(4)同一列族下的所有列会保存在一起。
(5)列在列族中是有序的。
在实际应用中,列族的控制权限能帮助管理不同类型的应用,例如一些应用允许添加新的基本数据,一些应用只允许浏览数据。需要特别注意的是,如果表中包含两个列族,那么属于两个列族的文件保存在相同的节点上,每个列族都会保存在自己的文件集合中。在列族中检索某列是顺序进行的I/O操作。
5.Row
HBase表中每一行的数据都是由一个RowKey和多个Column组成的,而且数据是按照RowKey的字典顺序进行存储的,查询数据时只能根据RowKey进行检索,由此可见RowKey的设计十分重要。如图1-6所示是HBase数据存储结构。
图1-6 HBase数据存储结构
1)RowKey简介
HBase是一个NoSQL数据库,它提供的主要操作是增加、删除、修改、查询(简称增、删、改、查)。在增、删、改、查的过程中,RowKey充当了主键的作用,它和众多的NoSQL数据库一样,可以唯一地标识一行记录。
RowKey可以是任意字符串,在HBase内部,RowKey保存为字节数组。存储时,数据按照RowKey的字典顺序存储。设计RowKey时,要充分利用排序存储这个特性,将经常一起读取的行存储到一起。
2)RowKey的特点
RowKey具有如下几个特点:
(1)RowKey类似于主键,可以唯一地标识一行记录。如果将数据插入HBase的时候不小心用了之前已经存在的RowKey,则系统会更新之前存在的那一行数据,而之前已经存在的值并不会丢掉,会被放到这个单元格的历史记录中,如果需要查询这个“历史”值,只需要带上版本参数就可以找到。
(2)由于数据按照RowKey的字典顺序存储,因此HBase中的数据永远都是有序的。
(3)HBase在读写数据时需要通过RowKey找到对应的Region。在HBase中,一个Region就相当于一个数据分片,每个Region都有起始RowKey和结束RowKey,HBase表中的数据是按照RowKey来分散存储到不同Region中的。所以在HBase中想要提高查询速度,就需要设计出优秀的RowKey,RowKey越完美,HBase的效率就越高。
6.Time Stamp
Time Stamp用于标识数据的不同版本号(Version),每条数据写入时,如果不指定时间戳,系统会自动为其添加该字段,该字段的值即为数据写入HBase的时间。
7.Cell
列是HBase的基本单位,一个列上可以存储多个版本的值,多个版本的值被存储在多个Cell中,多个版本之间用版本号来区分。所以,确定一条数据查询结果的表达式是行键:列族:列:版本号(RowKey:Column Family:Column:Version)。但是,在大部分查询中,版本号是可以省略的,不写版本号,HBase会默认获取最后一个版本的数据。完整的HBase数据存储结构如图1-7所示。
图1-7 HBase数据存储结构