日期:2014-05-16 浏览次数:20456 次
HBase是Hadoop中的一个简单数据库。它与Google的Bigtable特别相似,但也存在许多的不同之处。
数据模型
HBase数据库使用了和Bigtable非常相似的数据模型。用户在表格里存储许多数据行。每个数据行都包括一个可排序的关键字,和任意数目的列。表格是稀疏的,所以同一个表格里的行可能有非常不同的列,只要用户喜欢这样做。
?
列名是“<族名>:<标签>”形式,其中<族名>和<标签>可以是任意字符串。一个表格的<族名>集合(又叫“列族”集合)是固定的,除非你使用管理员权限来改变表格的列族。不过你可以在任何时候添加新的<标签>。HBase在磁盘上按照列族储存数据,所以一个列族里的所有项应该有相同的读/写方式。
?
写操作是行锁定的,你不能一次锁定多行。所有对行的写操作默认是原子的。
?
所有数据库更新操作都有时间戳。HBase对每个数据单元,只存储指定个数的最新版本。客户端可以查询“从某个时刻起的最新数据”,或者一次得到所有的数据版本。
?
概念模型
从概念上,一个表格是一些行的集合,每行包含一个行关键字(和一个可选的时间戳),和一些可能有数据的列(稀疏)。下面的例子很好的说明了问题:
?
?
?
?
物理模型
在概念上表格是一个稀疏的行/列矩阵,但是在物理上,它们按照列存储。这是我们的一个重要设计考虑。
?
上面“概念上的”表格在物理上的存储方式如下所示:
?
?
?
?
?
请大家注意,在上面的图中,没有存储空的单元格。所以查询时间戳为t8的“content:”将返回null,同样查询时间戳为t9,“anchor:”值为“my.look.ca”的项也返回null。
?
不过,如果没有指明时间戳,那么应该返回指定列的最新数据值,并且最新的值在表格里也时最先找到的,因为它们是按照时间排序的。所以,查询“contents:”而不指明时间戳,将返回t6时刻的数据;查询“anchor:”的“my.look.ca”而不指明时间戳,将返回t8时刻的数据。
?
例子
为了展示数据在磁盘上是怎么存储的,考虑下面的例子:
?
程序先写了行“[0-9]”,列“anchor:foo”;然后写了行“[0-9]”,列“anchor:bar”;最后又写了行“[0-9]”,列“anchor:foo”。当把memcache刷到磁盘并紧缩存储后,对应的文件可能如下形式:
?
row=row0, column=anchor:bar, timestamp=1174184619081 row=row0, column=anchor:foo, timestamp=1174184620720 row=row0, column=anchor:foo, timestamp=1174184617161 row=row1, column=anchor:bar, timestamp=1174184619081 row=row1, column=anchor:foo, timestamp=1174184620721 row=row1, column=anchor:foo, timestamp=1174184617167 row=row2, column=anchor:bar, timestamp=1174184619081 row=row2, column=anchor:foo, timestamp=1174184620724 row=row2, column=anchor:foo, timestamp=1174184617167 row=row3, column=anchor:bar, timestamp=1174184619081 row=row3, column=anchor:foo, timestamp=1174184620724 row=row3, column=anchor:foo, timestamp=1174184617168 row=row4, column=anchor:bar, timestamp=1174184619081 row=row4, column=anchor:foo, timestamp=1174184620724 row=row4, column=anchor:foo, timestamp=1174184617168 row=row5, column=anchor:bar, timestamp=1174184619082 row=row5, column=anchor:foo, timestamp=1174184620725 row=row5, column=anchor:foo, timestamp=1174184617168 row=row6, column=anchor:bar, timestamp=1174184619082 row=row6, column=anchor:foo, timestamp=1174184620725 row=row6, column=anchor:foo, timestamp=1174184617168 row=row7, column=anchor:bar, timestamp=1174184619082 row=row7, column=anchor:foo, timestamp=1174184620725 row=row7, column=anchor:foo, timestamp=1174184617168 row=row8, column=anchor:bar, timestamp=1174184619082 row=row8, column=anchor:foo, timestamp=1174184620725 row=row8, column=anchor:foo, timestamp=1174184617169 row=row9, column=anchor:bar, timestamp=1174184619083 row=row9, column=anchor:foo, timestamp |