1. 什么是HBase
简单来讲,HBase就是一个数据库。数据库不外乎两个作用:存储数据和管理数据
既然是数据库,已经有了RDBMS,如MySQL/Oracle,为什么还要HBase呢?
以Oracle为例,如果一张表有上亿条数据,你再怎么建索引,查询也是慢的。也就是説,传统的RDBMS不适合存储海量数据,而HBase就是专门应对海量数据的数据库
在Apache HBase™官网,是这样介绍HBase的:Apache HBase is the Hadoop database, a distributed(分布式的), scalable(可扩展的), big data store
Apache HBase官网还提及在什么情况下使用HBase:Use Apache HBase™ when you need random, realtime read/write access to your Big Data(当你需要对大数据进行随机、实时读写时,就可以使用HBase)
2. HBase起源
HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储。
官方网站:http://hbase.apache.org
- 2006年Google发表BigTable白皮书
- 2006年开始开发HBase
- 2008年北京成功开奥运会,程序员默默地将HBase弄成了Hadoop的子项目
- 2010年HBase成为Apache顶级项目
- 现在很多公司二次开发出了很多发行版本,你也开始使用了
3. 基于Hadoop的HBase架构
HBase的数据存储在RegionServer,RegionServer的数据最终存储在HDFS上
一开始可以暂时这样理解
- HMater相当于HDFS的NameNode
- HRegionServer相当于HDFS的DataNode

HBase内置有zookeeper,但一般我们会有其他的Zookeeper集群来监管master和regionserver,Zookeeper通过选举,保证任何时候,集群中只有一个活跃的HMaster,HMaster与HRegionServer 启动时会向ZooKeeper注册,存储所有HRegion的寻址入口,实时监控HRegionserver的上线和下线信息。并实时通知给HMaster,存储HBase的schema和table元数据,默认情况下,HBase 管理ZooKeeper 实例,Zookeeper的引入使得HMaster不再是单点故障。一般情况下会启动两个HMaster,非Active的HMaster会定期的和Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个HMaster反而增加了Active HMaster的负担。
一个RegionServer可以包含多个HRegion,每个HRegion维护一个HLog,和多个HFiles以及其对应的MemStore。RegionServer运行于DataNode上,数量可以与DatNode数量一致,请参考如下架构图:

4. RDBMS和HBase对比
结构对比
| RDBMS | HBase |
|---|---|
| 数据库以表的形式存在 | 数据库以region的形式存在 |
| 支持FAT、NTFS、EXT、文件系统 | 支持HDFS文件系统 |
| 使用Commit log存储日志 | 使用WAL(Write-Ahead Logs)存储日志 |
| 参考系统是坐标系统 | 参考系统是Zookeeper |
| 使用主键(PK) | 使用行键(row key) |
| 支持分区 | 支持分片 |
| 使用行、列、单元格 | 使用行、列、列族和单元格 |
| 数据以各种类型存储 | 数据全部以byte[](字节数组)存储 |
- RDBMS参考系统是坐标系统,即RDBMS运行在哪个操作系统,哪个系统就叫坐标系统
- 每条数据都有唯一的标识。RDBMS中是主键,HBase中是行键
- RDBMS中,数据有各种类型。在HBase中,所有数据都是以字节数组的形式存储,无论是什么数据,都要先转化为byte[],再存入HBase
功能对比
| RDBMS | HBase |
|---|---|
| 支持向上扩展 | 支持向外扩展 |
| 使用SQL查询 | 使用API和MapReduce来访问HBase表数据 |
| 面向行,即每一行都是一个连续单元 | 面向列,即每一列都是一个连续的单元 |
| 数据总量依赖于服务器配置 | 数据总量不依赖具体某台机器,而取决于机器数量 |
| 具有ACID支持 | HBase不支持ACID(Atomicity、Consistency、Isolation、rability) |
| 适合结构化数据 | 适合结构化数据和非结构化数据 |
| 传统关系型数据库一般都是中心化的 | 一般都是分布式的 |
| 支持事务 | HBase不支持事务 |
| 支持Join | 不支持Join |
5. HBase特征简要
5.1. 自动故障处理和负载均衡
HBase运行在HDFS上,所以HBase中的数据以多副本形式存放,数据也服从分布式存放,数据的恢复也可以得到保障。另外,HMaster和RegionServer也是多副本的。
5.2. 自动分区
HBase表是由分布在多个RegionServer中的region组成的,这些RegionServer又分布在不同的DataNode上,如果一个region增长到了一个阈值,为了负载均衡和减少IO,HBase可以自动或手动干预的将region切分为更小的region,也称之为subregion。
5.3. 集成Hadoop/HDFS
虽然HBase也可以运行在其他的分布式文件系统之上,但是与HDFS结合非常之方便,而且HDFS也非常之流行。
5.4. 实时随机大数据访问
HBase采用log-structured merge-tree作为内部数据存储架构,这种架构会周期性地将小文件合并成大文件以减少磁盘访问同时减少NameNode压力。
5.5. MapReduce
HBase内建支持MapReduce框架,更加方便快速,并行的处理数据。
5.6. Java API
HBase提供原声的Java API支持,方便开发。
5.7. 横向扩展
HBase支持横向扩展,这就意味着如果现有服务器硬件性能出现瓶颈,不需要停掉现有集群提升硬件配置,而只需要在现有的正在运行的集群中添加新的机器节点即可,而且新的RegionServer一旦建立完毕,集群会开始重新调整。
5.8. 列存储
HBase是面向列存储的,每个列都单独存储,所以在HBase中列是连续存储的,而行不是。
5.9. HBase Shell
HBase提供了交互式命令行工具可以进行创建表、添加数据、扫描数据、删除数据等操作和其他一些管理命令。
6. HBase在集群中的定位
HBase一种是作为存储的分布式文件系统,另一种是作为数据处理模型的MR框架。因为日常开发人员比较熟练的是结构化的数据进行处理,但是在HDFS直接存储的文件往往不具有结构化,所以催生出了HBase在HDFS上的操作。如果需要查询数据,只需要通过键值便可以成功访问。