本文系转载,若有侵权,请联系我:likui0913@gmail.comcss
HBase 与 Google 的 BigTable 极为类似,能够说 HBase 就是根据 BigTable 设计的,这一点在 BigTable 论文中也能发现。html
在 BigTable 论文中提到了它的应用场景:数据库
BigTable 是一个分布式的结构化数据存储系统,它被设计用来处理海量数据:一般是分布在数千台普通服务器上的 PB 级的数据。apache
Google 的不少项目使用 Bigtable 存储数据,包括 Web 索引、Google Earth、Google Finance。这些应用对 Bigtable 提出的要求差别很是大,不管是在数据量上(从 URL 到网页到卫星图像)仍是在响应速度上(从后 端的批量处理到实时数据服务)。数组
Bigtable 已经在超过 60 个 Google 的产品和项目上获得了应用,包括 Google Analytics、Google Finance、 Orkut、Personalized Search、Writely 和 Google Earth。服务器
以上应用场景的一个典型特色就是会不断的插入新的数据,而不怎么修改,好比Web 索引、Google Earth。而同时呢,也可能须要保存必定的历史数据用以查看或分析,好比网页快照、Google Analytics、或者联想到现在的大数据中,根据您以往的行为来预测您的行为与喜爱等。另外它存储的属性可能会不少且不固定,好比一个网页的数据,除了它的内容外,可能还须要存储它相关的外链、关键字、锚点、标题、图片等。分布式
那么根据这些应用的需求,对 BigTable 中的数据总结有如下特色:ide
在 HBase 中,数据存储在具备行和列的表中,表的每行包含一个或多个列族,每一个列族则可能包含一个或多个列,而行与列的交叉点则被称为单元格,用来存放数据的值。大数据
Table 是在建立表时的 schema 声明定义的,其一旦建立便不可修改。优化
与传统关系系数据库相似却又不太相同,HBase 中的行具备以下特色:
列族是一个或多个列的集合,列能够动态增减,可是列族则须要在建立或修改表时提早定义。同一个列族下的全部列使用相同的前缀来标识其属于哪个列族,好比列courses:history
和courses:math
都是列族courses
的成员。
在物理存储上,一个列族下的全部成员在文件系统上是存储在一块儿的,这个原理对于以后的优化有着重要的意义。
单元格是行与列的交叉点,同时由于版本的存在,因此它相似于一个3维元祖 {row, column, version},同行键同样,单元格中的内容也是不可分割的字节数组。
以稍微修改过的 BigTable 论文中的 Webtable 为例:有一个名为 WebTable 的表格,其中包含两行(com.cnn.www 和 com.example.www)和三个名为 contents、anchor 和 people 的列族。对于第一行(com.cnn.www),anchor 包含两列(anchor:cssnsi.com,anchor:my.look.ca),contants 包含一列(contents:html)。同时,row key 为 com.cnn.www 的行保存了 5 个版本(5 个历史数据),row key 为 com.example.www 的行则只保存了 1 个版本。contents 列族中,html 列限定符中包含指定网站的整个 HTML 内容。anchor 列族中,每一个限定符都包含连接到该行所表明的站点的外部站点,以及它在连接锚点(anchor)中使用的文本。people 列族中则保存与该网站相关的人员。
那么根据这个示例,能够获得以下的逻辑视图与物理视图。
Row Key | Time Stamp | ColumnFamily contents |
ColumnFamily anchor |
ColumnFamily people |
---|---|---|---|---|
“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>…” | ||
“com.example.www” | t5 | contents:html = “<html>…” | people:author = “John Doe” |
与传统的关系型数据库不一样的是,此表中为空的单元格(Cell)在实际中并不会占用空间或者说事实上并不存在,这正是 HBase “稀疏”的缘由。使用表格只是查看 HBase 数据的一种方式,一样也能够转换成 JSON 格式:
{ "com.cnn.www": { contents: { t6: contents:html: "<html>..." t5: contents:html: "<html>..." t3: contents:html: "<html>..." } anchor: { t9: anchor:cnnsi.com = "CNN" t8: anchor:my.look.ca = "CNN.com" } people: {} } "com.example.www": { contents: { t5: contents:html: "<html>..." } anchor: {} people: { t5: people:author: "John Doe" } } }
HBase 的数据按照列族(cloumn family)物理存储。也便是说不一样列族下的数据被分开存放,您能够随时将新的列限定符(column_family:column_qualifier)添加到现有的列族。对应上面的示例,它的物理存储以下:
列族 anchor:
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” |
列族 contents:
Row Key | Time Stamp | Column Family contents |
---|---|---|
“com.cnn.www” | t6 | contents:html = “<html>…” |
“com.cnn.www” | t5 | contents:html = “<html>…” |
“com.cnn.www” | t3 | contents:html = “<html>…” |
列族 people:
Row Key | Time Stamp | Column Family people |
---|---|---|
“com.example.www” | t5 | people:author = “John Doe” |
这样的物理视图有 3 个特色: