1.1 概述
Google BigTable论文中BigTable的定义:Bigtable是一个疏松的分布式的持久的多维排序的map,这个map被行键,列键,和时间戳索引.每一个值都是无解释数组.(A Bigtable is a sparse, distributed, persistent multidimensional sorted map. The map is indexed by a row key, column key, and a timestamp; each value in the map is an uninterpreted array of bytes.)
1.2 数据模型
HBASE中的每一张表,就是所谓的BigTable。BigTable会存储一系列的行记录,行记录有三个基本类型的定义:Row Key,Time Stamp,Column。Row Key是行在BigTable中的唯一标识,Time Stamp是每次数据操作对应关联的时间戳。用户在表格中存储数据,每一行都有一个可排序的主键和任意多的列。由于是稀疏存储的,所以同一张表里面的每一行数据都可以有截然不同的列。Column定义为"<family>:<label>",通过这两部分可以唯一的指定一个数据的存储列,family的定义和修改需要对HBASE作类似于DB的DDL操作,而对于label的使用,则不需要定义直接可以使用,这也为动态定制列提供了一种手段。family另一个作用其实在于物理存储优化读写操作,同family的数据物理上保存的会比较临近,因此在业务设计的过程中可以利用这个特性。Hbase把同一个family里面的数据存储在同一个目录底下,而Hbase的写操作是锁行的,每一行都是一个原子元素,都可以加锁。
HBase在物理距离比较近的磁盘上储存列组,所以同一列组中的元素要有完全一样的读/写特性并且包含的数据也要相似。
所有数据库的更新都有一个时间戳标记,每个更新都是一个新的版本,而hbase会保留一定数量的版本,这个值是可以设定的。客户端可以选择获取距离某个时间最近的版本,或者一次获取所有版本。
下面我们分别看一下逻辑数据模型和物理数据模型。
1) 逻辑数据模型
Row Key | Time Stamp | Column "contents:" | Column "anchor:" | Column "mime:" | |
"com.cnn.www" | t9 | | "anchor:cnnsi.com " | "CNN" | |
t8 | | "anchor:my.look.ca" | "CNN.com" | | |
t6 | "<html>..." | | | "text/html" | |
t5 | "<html>..." | | | | |
t3 | "<html>..." | | | |
上图是一个存储Web网页的范例列表片断。行名是一个反向URL{即com.cnn.www}。contents列族{原文用 family,译为族,详见列族}存放网页内容,anchor列族存放引用该网页的锚链接文本。CNN的主页被Sports Illustrater{即所谓SI,CNN的王牌体育节目}和MY-look的主页引用,因此该行包含了名叫“anchor:cnnsi.com”和 “anchhor:my.look.ca”的列。每个锚链接只有一个版本{由时间戳标识,如t9,t8};而contents列则有三个版本,分别由时间戳t3,t5,和t6标识。
每一行的唯一标识为com.cnn.www,每一次逻辑修改都有一个timestamp关联对应,一共有四个列定义:<contents:>,<anchor:cnnsi.com>,<anchor:my.look.ca>,<mime:>。如果用传统的概念来将BigTable作解释,那么BigTable可以看作一个DB Schema,每一个Row就是一个表,Row key就是表名,这个表根据列的不同可以划分为多个版本,同时每个版本的操作都会有时间戳关联到操作的行。
每一个行可以多个family,每一个family可以包含无数个Column,每一个Column都可以有一个不同于其他列的时间戳。在通用数据库中当表创建时我们就已经定义了列,如果修改表结构的话会非常困难(比如:添加一列)。在HBase中我们可以很轻松地添加一个列族或列。
2)物理数据模型
上面的逻辑模型在物理存储的时候应该表现成下面那样子:
Row Key | Time Stamp | Column "contents:" |
"com.cnn.www" | t6 | "<html>..." |
t5 | "<html>..." | |
t3 | "<html>..." |
Row Key | Time Stamp | Column "anchor:" | |
"com.cnn.www" | t9 | "anchor:cnnsi.com" | "CNN" |
t8 | "anchor:my.look.ca" | "CNN.com" |
Row Key | Time Stamp | Column "mime:" |
"com.cnn.www" | t6 | "text/html" |
对于BigTable的数据模型操作的时候,会锁定Row,并保证Row的原子操作。