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。在创建表时,只需指定列族,而无须预先定义列限定符。一个行可以有三个列,而在另一个行中可以插入四个列的数据,也就是说,对于不同的行,列可以完全不一样。

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数据存储结构