引论: Apache HBase是一个开源的,分布式,非关系型的列式数据库,HBase位于Hadoop生态系统的结构化存储层,数据存储于分布式文件系统的HDFS并且使用Zookeeper作为协调服务。 HDFS为HBase提供了高可靠性的底层存储支持,MapReduce为HBase提供了高性能的计算能力。Zookeeper则为HBase提供了稳定的服务和实现恢复机制。

        HBase的设计目的是处理非常庞大的表,甚至可以使用普通的计算机处理超过10亿行的,有数百万列组成的表的数据。由于HBase依赖于Hadoop HDFS,因此它与Hadoop一样,主要依靠横向拓展,并不断增加廉价的商业服务器来提高计算和存储能力。

       HBase对表的处理具有如下特点:

         一个表可以有上亿行,上百万列。

        采用面向列的存储和权限控制

        为空(NULL)的列并不占用存储空间。

     HBase与传统关系数据库(RDBMS)的区别:

类别

HBase

RDBMS

硬件架构

分布式集群,硬件成本低廉

传统多核系统,硬件成本昂贵

数据库大小

PB

GB,TB

数据分布方式

稀疏的,多维的

以行和列组织

数据类型

只用简单的字符串类型,所有其他类型都由用户自定义

丰富的数据类型

存储模式

基于列存储

基于表结构的行模式存储

数据修改

可以保留旧版本数据,插入对应的新版本数据

替换修改旧版本数据

事务支持

只支持单个行级别

对行和表全面支持

查询语言

可以使用Java API,若结合其他框架,如Hive,可以使用HiveQL

SQL

吞吐量

百万查询每秒

数千查询每秒

索引

只支持行键,除非结合其他技术,如Hive

支持

 

      HBase基本结构

HBase数据库的基本组成结构如下:

1.表(table)

在HBase中,数据存储在表中,表名是一个字符串(string),表有行和列组成。与关系型数据库(RDBMS)不同,HBase表是多维映射的。

2.行(row)

 HBase中的行由行键(rowkey)和一个或者多个列(column)组成。行键没有数据类型,总是视为字节数组byte[]。行键类似于关系数据库中的主键索引,在整个HBase表中是唯一的,但与RDBMS不同的是。行键按照字母顺序排序。例如.表中已有三条行键为1000000

和10000002,10000004的数据,当插入一条行键为10000003的数据时,该条数据不会排在最后,而是排在行键10000002和100000004的中间。因此,行键的设计非常重要,我们可以利用行键的这个特性将相关的数据排列在一起。

3.列族(column family)

 HBase列族由多个列组成,相当于将列进行分组。列的数量没有限制,一个列族可以有数百万个行。表中的每一行都有同样的列族。列族必须在表创建的时候指定,不能轻易修改,且数量不能太多,一般不超过3个。列族名的类型是字符串(String)。

4.列限定符(qualifier)

列限定符用于代表HBase表中列的名称,列族里的数据通过列限定符来定位。常见的定位格式为"family:qualifier" (列如:要定位到列族cf1中的列name,则使用cf1:name) 。HBase中的列族和列限定符都可以理解为列,只是级列不同,一个列族下面可以有多个类限定符,因此列族可以简单地理解为第一级列,列限定符是第二级列,两者是父子关系。与行键不同,列限定符没有数据类型,总是视为字节数组byte[].

5.单元格(cell)

单元格通过行键,列族和列限定符一起来定位。单元格包含值和时间戳。值没有数据类型,总是视为字符数组byte[] ,时间戳代表该值的版本,类型为long。默认情况下,时间戳表示数据写入服务器的时间,但是当数据放入单元格时,也可以指定不同的时间戳。每个单元格根据时间戳保存着同一份数据的多个版本,且降序排列,即最新的数据排在前面,这样有利于快速查找最新数据。

对单元格中的数据进行访问的时候会默认读取最新的值。