3.1 两类数据模型
本节将从逻辑模型和物理模型两方面来了解HBase的数据模型,表是HBase表达数据的逻辑组织方式,而基于列的存储则是数据在底层的组织方式。本节将首先学习关于逻辑模型的一些重要概念及基本操作以及HBase实际存储数据的一些特点,为后面的学习打好基础。
3.1.1 逻辑模型
HBase是一个类似GoogleBigTable的开源分布式数据库,大部分特性和BigTable相同,可以理解为是一个稀疏的、长期存储的、多维度的和排序的映射表,表中的每一行可以有不同的列。与关系型数据库不同,关系型数据库要求表在被创建时明确定义列以及列的数据类型,而HBase的同一个表的记录可以有不一样的列。
HBase中最基本的单位是列,一列或者多列构成了行,行有行键(Rowkey),每一行的行键都是唯一的,相同行键的插入操作被认为是对同一行的操作,也就是说如果做了两次写入操作,而行键是同一个,那么后面的操作可以认为是对该行的某些列的更新操作。
HBase中的一个表有若干行,每行有很多列,列中的值有多个版本,每个版本的值称为一个单元格,每个单元存储的是不同时刻该列的值。图3-1是Google的BigTable论文中的Webtable表的逻辑模型,由于HBase被认为是BigTable的开源实现,所以该图对HBase完全适用,表名为Webtable,包含两个列族:contents和anchor。在该实例中,列族anchor有两个列(anchor:cssnsi.com和anchor:my.look.ca),列族contents仅有一个列contents:html。
其中,列名是由列族前缀和修饰符(Qualifier)连接而成,分隔符是英文冒号。例如,列anchor:my.look.ca是列族anchor前缀和修饰符my.look.ca组成。所以在提到HBase的列的时候应该用“列族前缀+修饰符”的方式才准确。
如图3-1所示,在表Webtable的逻辑模型中,所有的列族和列都紧凑在一起,其中并没有附带物理存储方式的概念。该逻辑视图是为了使读者更好地、更直观地理解HBase的数据模型,并不代表实际的数据存储也是这种形式。
如果熟悉Java语言里的Map数据结构,可以把HBase理解为这种结构的无限嵌套版本。
3.1.2 物理模型
虽然在逻辑模型中,表可以被看成一个稀疏的行的集合。但在物理上,表是按列分开存储的。HBase的列是按列族分组的,HFile是面向列的,存放行的不同列的物理文件,一个列族的数据存放在多个HFile中,最重要的是一个列族的数据会被同一个Region管理,物理上存放在一起。Region是管理HFile的一种机制,这个将会在后面讨论。这种物理上存储的不同可以从下面的物理视图中直观看出,如表3-1和表3-2所示。表3-1中展示了列族anchor的集中存储。表3-2中展示了列族contents的集中存储。
HBase的表被设计成可以不禁用表而随时加入新的列,因此可以将新列直接加入一个列族而无须声明。
在上面的逻辑模型中,空白Cell在物理上是不存储的,因此,若一个请求为要获取t8时间的contents:html,它的结果就是空。相类似,若请求为获取t9时间的anchor:my.look.ca,结果也是空。但是,如果不指明时间,将会返回最新时间的行,每个最新的都会返回。例如,假设请求获取行键为"com.cnn.www"的各列的值,如果没有指明时间戳,返回的结果是t6下的contents:html、t9下的anchor:cnnsi.com和t8下的anchor:my.look.ca所对应的值。