引论: 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。默认情况下,时间戳表示数据写入服务器的时间,但是当数据放入单元格时,也可以指定不同的时间戳。每个单元格根据时间戳保存着同一份数据的多个版本,且降序排列,即最新的数据排在前面,这样有利于快速查找最新数据。
对单元格中的数据进行访问的时候会默认读取最新的值。