HBase是一个开源分布式数据库,基于hadoop分布式文件系统,它的原型是google的BigTable分布式数据库。HBase是apache hadoop生态圈中的重要子项目之一。
HBase的设计目标是处理非常庞大的表,可以使用普通的计算机处理超过10亿行数据,并且有百万列元素组成的数据表。因此在文件在几百万行或者上千万行时不需要使用HBase。
在Hadoop生态圈中,HDFS为HBase提供了高可用性的底层存储支持,MapReduce为其提供了高可用性的计算能力,Hive和Pig提供了操作数据库的语言,zookeeper保证了分布式数据库的一致性要求,Sqoop提供了传统关系数据库的导入功能。它们都使得HBase的使用越来越广泛、越来越简单。下图为它们之间的关系。
图一:Hadoop 生态圈中各个子项目之间的关系结构图
数据模型是数据抽象的描述,是将现实中对象转化成数据的抽象过程。数据模型可以分为逻辑数据模型和物理逻辑模型。逻辑数据模型是设计人员对整个数据库的全面描述,描述的是数据和数据之间逻辑上的关系。所谓物理模型是数据库最低层的抽象,它描述数据在磁盘上的存储方式(文件的结构)、存储设备(外存的空间分配)和存取方法(主索引和辅助索引)。
HBase的逻辑模型
由于HBase是一个稀疏的、长期存储的、多维度的、排序的映射表。简单来说,应用程序是以表的方式在HBase存储数据的。表是由行和列构成的,所有的列式从属于某一个列族的。行和列的交叉点成为cell,cell是版本化的。Cell的内容是不可分割的字节数组。表的行键也是一段字节数组,所有任何东西都可以保存进去,不论是字符串还是数字。HBase的表是按key排序的,排序方式是针对字节的。所有的表都必须要有主键-key。
下面我们根据一个实例来讲解一下HBase的逻辑模型。下表是一个数据表的逻辑模型的逻辑视图。它表示的含义是,在一个网站中,每个网页的内容和锚点。
表一:逻辑视图 | |||
Row Key | Time Stamp | ColumnFamily contents | ColumnFamily anchor |
“com.cnn.www” | t9 | anchor:cnnsi.com=”CNN” | |
“com.cnn.www” | t8 | anchor:my.look.ca=”CNN.com” | |
“com.cnn.www” | t6 | contents:html=”<html>…” | |
“com.cnn.www” | t5 | contents:html=”<html>…” | |
“com.cnn.www” | t3 | contents:html=”<html>…” |
表中参数解释
RowKey(行键)
行键是数据行在表中的唯一标识,是该记录的主键,相当于是关系数据库的主键。行键可以是任意字符串,最大长度为64KB,在HBase内部,行键保存为字节数组。存储时,数据按照行键的字典序(byte order)排序存储。设计key时,要注意排序存储这个特性,将经常一起读取的行存储放在一起。比如在电商中,行键设计为userId+url,这样的话,某个用户的访问路径就放在了一起,在推荐系统中可以方便的读取这些信息。在关系数据库中,主键是唯一标识的,不能重复的,在HBase中是不是也是如此呢?访问HBase table中的行时,通过行键访问或全表扫描。
列族
HBase表中的每个列都归属于某个列族。列名是由它的列族前缀额修饰符连接而成的。例如列contents:html是列族 contents加冒号(:)加修饰符html组成的。
时间戳
时间戳是HBase区别与传统关系数据库的重要特点。我们HDFS和HBase存储的都是流式数据。在HBase中进行update和delete操作时,实际上并没有将原来的数据进行更新和删除,而是插入新的数据,只是时间戳不同而已。HBase根据时间戳来判断哪个数据时最新的版本。时间戳的类型是64位的整型,默认情况下,它由系统根据当前时间自动生成,用户也可以设置时间戳。我们知道HBase是基于HDFS设计的,因此HBase的很多特性跟HDFS有密切的关系。
Cell
图中,一个个的单元格就是一个cell。HBase中的元素由行键、列和时间戳唯一确定,元素中的数据以字节码形式存储,没有特定的类型。cell是一个完整的部分,不能被分割。
HBase的逻辑模型是一个类似于稀疏矩阵的表格,它里面允许为空。
HBase的物理模型
尽管在概念逻辑视图中,表可以看成是一个稀疏的行的集合,但是在物理上,它是区分列族存储的。新的columns可以不经过声明直接加入一个列族。下面的表格是表一的物理视图。
表二:物理视图 | ||
Row Key | Time Stamp | Column Family anchor |
“com.cnn.www” | t9 | anchor:cnnsi.com=”CNN” |
“com.cnn.www” | t8 | anchor:my.look.ca=”CNN.com” |
“com.cnn.www” | t6 | contents:html=”<html>…” |
“com.cnn.www” | t5 | contents:html=”<html>…” |
“com.cnn.www” | t3 | contents:html=”<html>…” |
值得注意的是在上面的概念视图中空白的cell在物理上是不存储的,因为根本没有必要,而且存储的话会浪费大量的空间。因此若一个请求要获取t8时间的contents:html ,他的结果就是空。相似的,若请求为获取t9时间的anchor:my.look.ca,结果也是空。但是,如果不指明时间,将会返回最新时间的行,每个最新的都会返回。例如,如果请求为获取行键为”com.cnn.www”,如果没有指明时间戳的话,活动的结果是t6下的contents:html ,t9下的anchor:cnnsi.com和t8下的anchor:my.look.ca。
物理模型的特点是将不为空的cell存储起来。空白的就不再存储,不再是逻辑模式展示的矩阵的样子。
在上面我们对HBase的逻辑模型和物理模型做了详细的介绍,总结一下HBase和传统关系数据库在逻辑模型和物理模型中的相同点和不同点。
表三:HBase和关系数据库的不同 | ||
HBase分布式数据库 | 关系数据库 | |
逻辑模型 | 稀疏矩阵,比传统数据库多了一个时间戳 | 二维矩阵的形式 |
物理模型 | 由于数据库逻辑模型是一个巨大的稀疏矩阵,空cell是不存储的 | 矩阵全部存储 |