浅析HBase数据模型

Posted by JustDoDT on July 3, 2019

应用场景

HBase 与 Google 的 BigTable 极为类似,可以说 HBase 就是根据BigTable 设计的,这一点在 BigTable 论文可以找到。

在 BigTable 论文中提到了她的应用场景:

BigTable 是一个分布式的结构化数据存储系统,她被设计用来处理海量数据:通常是分布式在数千台普通服务器上的 PB 级别的数据。

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 中的数据总结有以下的特点:

  • 数据量大
  • 属性不固定
  • 插入多,但不存在频繁的修改
  • 存在历史版本数据

根据Apache HBase 官网可以得出

Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.

Use Apache HBase™ when you need random, realtime read/write access to your Big Data. This project’s goal is the hosting of very large tables – billions of rows X millions of columns – atop clusters of commodity hardware. Apache HBase is an open-source, distributed, versioned, non-relational database modeled after Google’s Bigtable: A Distributed Storage System for Structured Data by Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS.

Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。

当您需要对大数据进行随机,实时读/写访问时,请使用Apache HBase™。 该项目的目标是托管非常大的表 - 数十亿行和百万列 ,在集群上。Apache HBase是一个开源的,分布式的,版本化的非关系数据库,模仿Google的Bigtable:Chang等人的结构化数据分布式存储系统。 正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和HDFS之上提供类似Bigtable的功能。

Table 组成元素

在 HBase 中,数据存储在具有行和列的表中,表的每行包含一个或多个列族,每个列族则可能包含一个或多个列,而行与列的交叉点则被称为单元格,用来存放数据的值。

HBase数据

表(Table)

Table 是创建表时的 Schema 声明定义的,其一且创建便不可修改。

行(Row)

与传统关系型数据库类似却又不太相同,HBase 中的行具有如下特点:

  • 行由一个或多个列族组成,每个列族包含一个或多个列,列可以动态添加
  • 每个行都包含一个行健(Rowkey),类似于关系型数据库的主键
    • rowkey 是不可分割的字节数组,Table 中的行按照 rowkey 的字典顺序由低到高 有序排列
  • 每行可以存储多个历史版本,默认读取的为最新的版本

列族(Column Family)

列族是一个或多个列的集合,列可以动态增减,但是列族则需要在创建或修改表的时候提前定义。同一个列族下的所有列使用相同的前缀来标识其属于哪一个列表,比如列courses:historycourses:math 都是列族 courses 的成员。

注意:在物理存储上,一个列族下的所有成员在文件系统上是存储在一起的,这个原理对于之后的优化有着重要的意义。

单元格(Cells)

单元格是行与列的交叉点,同时因为版本的存在,所以她类似于一个三维元祖{row,column,version},和rowkey 一样,单元格中的内容是不可以分割的字节数组。

时间戳(Timestamp)

时间戳与每个值一起写入,并且是给定版本值的标识符。 默认情况下,timestamp表示写入数据时RegionServer上的时间,但是当您将数据放入单元格时,可以指定不同的时间戳值。

示例

根据Apache HBase 官网上的例子,如下。

有一个名为 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个特点

  • 概念视图(逻辑视图)为空的单元格不会被存储
  • 通过 rowkey 、时间戳、列族、限定符可以定位到一条数据
  • 如果未指定时间戳,将返回最新的数据。比如 get(RowKey=”com.cnn.www”, column_family:column_qualifier=”contents:html”),将返回 t6 时间的值。

命名空间(Namespace)

命名空间就和 MySQL 中有多个数据一样,比如mysql库,test库,sys库一样。命名空间可以创建,删除或更改。通过指定表单的完全限定表名,在表创建期间确定命名空间成员资格:

预定义命名空间

  • hbase - system namespace, used to contain HBase internal tables
  • default - tables with no explicit specified namespace will automatically fall into this namespace
#namespace=foo and table qualifier=bar
create 'foo:bar', 'fam'

#namespace=default and table qualifier=bar
create 'bar', 'fam'

参考资料