欢迎投稿

今日深度:

HBase数据模型,

HBase数据模型,


原文地址:http://www.cnblogs.com/NicholasLee/archive/2012/09/13/2683272.html


  HBase是一个类似于Bigtable的分布式数据库,它是一个稀疏的长期存储的(存在硬盘上)、多维度的、排序的映射表。这张表的索引是行关键字;列关键字和时间戳。HBase中的数据都是字符串,没有类型。

  用户在表格中存储数据,每一行都有一个可排序的主键和任意多的列。由于是稀疏存储,所以同一张表里面的每一行数据都可以有截然不同的列。

  列名字的格式是"<family>:<qualifier>",都是由字符串组成的。每一张表有一个列族集合,这个集合是固定不变的,只能通过改变表结构来改变,但是qualifier的值相对于每一行来说都是可以改变的。

  HBase把同一个列族的数据村住在同一个目录底下,如下图,artile和author分别是两个列族:

  HBase所有数据库的更新都有一个时间戳标记,每个更新都是一个新的版本,HBase会保留一定数量的版本,这个值是可以设定的。

 

一、概念视图

RowKey Time Stamp Column Family:article Column Family:author
rowkey1 t4 article:title HBase in Action author:name lee
t3 article:content HBase is the hadoop database. author:nickname nicholas
t2 article:tag HBase,Hadoop,NoSQL    
rowkey2 t1 ... ... ... ...

  如上图所示,blog表有两行数据,rowkey1和rowkey2,并且有两个列族article和author,在第一行数据中,列族article有三条数据,列族author有两条数据,每一条数据对应的时间戳都用数字来标示,编号越大标示数据越旧,反之数据越新。

 

二、物理视图

  虽然从概念视图上来按每个表格是有很多行来组成的,但是在屋里存储上面,它是按照列来保存的,上面的概念视图在物理存储的时候应该表现成下面的样子:

RowKey Time Stamp Column Family:article
rowkey1 t6 article:title HBase in Action
t5 article:content HBase is the hadoop database.
t4 article:tag HBase,Hadoop,NoSQL

 

RowKey Time Stamp Column Family:article
rowkey1 t3 author:name lee
t2 author:nickname nicholas

  需要注意的是,在概念视图上的有些列是空白的,这样的列实际不会被存储,当请求这些空白的单元格时,会返回null值。如果在查询的时候不提供时间戳,那么会返回距离现在最近的那一个版本的数据,因为在存储的时候,数据会按照时间戳来排序。

 

三、HTable的一些基本概念(这一段内容来自http://www.taobaotest.com/blogs/qa?bid=13850)

  • Row key
  行主键, HBase不支持条件查询和Order by等查询,读取记录只能按Row key(及其range)或全表扫描,因此Row key需要根据业务来设计以利用其存储排序特性(Table按Row key字典序排序如1,10,100,11,2)提高性能。
  • Column Family(列族)
  在表创建时声明,每个Column Family为一个存储单元。在上例中设计了一个HBase表blog,该表有两个列族:article和author。
  • Column(列)
  HBase的每个列都属于一个列族,以列族名为前缀,如列article:title和article:content属于article列族,author:name和author:nickname属于author列族。 Column不用创建表时定义即可以动态新增,同一Column Family的Columns会群聚在一个存储单元上,并依Column key排序,因此设计时应将具有相同I/O特性的Column设计在一个Column Family上以提高性能。
  • Timestamp
  HBase通过row和column确定一份数据,这份数据的值可能有多个版本,不同版本的值按照时间倒序排序,即最新的数据排在最前面,查询时默认返回 最新版本。如上例中row key=1的author:nickname值有两个版本,Timestamp默认为系统当前时间(精确到毫 秒),也可以在写入数据时指定该值。
  • Value
  每个值通过4个键唯一索引,tableName+RowKey+ColumnKey+Timestamp=>value,例如上例中 {tableName=’blog’,RowKey=’1’,ColumnName=’author:nickname’,Timestamp=’ 1317180718830’}可以索引到唯一值。
  • 存储类型
  TableName 是字符串 RowKey 和 ColumnName 是二进制值(Java 类型 byte[]) Timestamp 是一个 64 位整数(Java 类型 long) value 是一个字节数组(Java类型 byte[])。
  • 存储结构
  可以简单的将HTable的存储结构理解为:   即HTable按Row key自动排序,每个Row包含任意数量个Columns,Columns之间按Column key自动排序,每个Column包含任意数量个Values。理解该存储结构将有助于查询结果的迭代。  

四、HBase与RDBMS

  HBase就是这样一个基于列模式的映射数据库,它只能表示很简单的键-数据的映射关系,这大大简化了传统的关系型数据库。与关系型数据库相比,它有如下特点:

  1.数据类型:HBase操作只有简单的字符串类型,所有的类型都是交由用户自己处理的,它只保存字符串。而关系型数据库有丰富的类型和存储方式。

  2.数据操作:HBase只有很简单的插入,查询,删除,清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系,所以不能也没有必要实现表和表之间的关联等,而关系型数据库通常有各种各样的函数,连接操作。

  3.存储模式:HBase是基于列存储的,每个列族都有几个文件保存,不同列族的文件是分离的。传统的关系数据库是基于表格结构和行模式保存的。

  4.数据维护:确切的来说,HBase的更新操作应该不叫更新,虽然一个主键或列会对应新的版本,但它的旧版本依然会保留,所以它实际是插入了新数据,而不是传统关系型数据库里面的替换修改。

  5.可伸缩性:HBase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻易的增加或者减少硬件数量,并且对错误的兼容性比较高,而传功关系型数据库通常需要增加中间层才能实现类似的功能。

www.htsjk.Com true http://www.htsjk.com/hbase/42199.html NewsArticle HBase数据模型, 原文地址:http://www.cnblogs.com/NicholasLee/archive/2012/09/13/2683272.html HBase是一个类似于Bigtable的分布式数据库,它是一个稀疏的长期存储的(存在硬盘上)、多维度的、排序的...
相关文章
    暂无相关文章
评论暂时关闭