1.1、HBase概述

HBase是谷歌公司BigTable的开源实现。BigTable是一个分布式存储系统,利用谷歌提出的MapReduce分布式并行计算模型来处理海量数据,使用谷歌分布式文件系统GFS作为底层数据存储,并采用Chubby提供协同服务管理,可以扩展到PB级别的数据和上千台机器,具备广泛应用型、可扩展性、搞性能和高可用性等特点。
BigTable具备以下特点:

  • l 支持大规模海量数据;
  • l 分布式并发数据处理效率极高;
  • l 易于扩展且支持动态伸缩;
  • l 适用于廉价设备;
  • l 适合于读操作不适合写操作。

1.2、和传统关系型数据库的区别

· 数据类型。
关系数据库采用关系模型,具有丰富的数据类型和存储方式。HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串,用户可以把不同格式的数据化数据和非结构化数据都序列化成字符串保存到HBase中,用户需要自己编写程序把字符串解析成不同的数据类型。
· 数据操作。
关系数据库中包含了丰富的操作,如:增、删、改、查等,其中会涉及复杂的多表连接,通常是借助于多个表之间的主外键关联来实现的。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除和清空等。因为HBase在设计上就避免了复杂的表与表之间的关系,通常只采用单表的主键查询,所以它无法实现向关系数据库中那样的表与表之间的连接操作。
· 存储模式。
关系数据库是基于行模式存储的,元组或行会被连续地存储在磁盘页中。HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的。其优点是可以降低I/O开销,支持大量并发用户查询。因为仅需要处理可以回答这些查询的列,而不需要处理与查询无关的大量数据行;同一个列族中的数据会被一起进行压缩,由于同一列族内的数据相似度较高,因此可以获得较高的数据压缩比。
· 数据索引。
关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引–>行键(RowKey),HBase中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来。由于HBase位于Hadoop框架之上,因此可以使用Hadoop MapReduce来快速、高效地生成索引表。
· 数据维护
在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧的版本任然保留。
· 可伸缩性。
关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,因此能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。
· 其他
相对于关系型数据库来说,HBase也有自身的局限性,如HBase不支持事务,因此无法实现跨行的原子性。

1.3 HBase应用场景

l 交通方面:船舶GPS信息,全长江的船舶GPS信息,每天有1千万左右的数据存储。
l 金融方面:消费信息,贷款信息,信用卡还款信息等
l 电商:淘宝的交易信息等,物流信息,浏览信息等
l 移动:通话信息等,都是基于HBase的存储。

1.4 HBase的特点:


1. 容量大:传统关系型数据库,单表不会超过五百万,超过要做分表分库,不会超过30列HBase单表可以有百亿行、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具有弹性
2. 面向列:面向列的存储和权限控制,并支持独立检索,可以动态增加列,即,可单独对列进行各方面的操作列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数量
3. 多版本:Hbase的每一个列的数据存储有多个Version,比如住址列,可能有多个变更,所以该列可以有多个version
4. 稀疏性:为空的列并不占用存储空间,表可以设计的非常稀疏。
不必像关系型数据库那样需要预先知道所有列名然后再进行null填充
5. 拓展性:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点服务(机器)就可以
6. 高可靠性:WAL机制,保证数据写入的时候不会因为集群异常而导致写入数据丢失Replication机制,保证了在集群出现严重的问题时候,数据不会发生丢失或者损坏Hbase底层使用HDFS,本身也有备份。
7.高性能:底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得Hbase写入性能非常高。Region切分、主键索引、缓存机制使得Hbase在海量数据下具备一定的随机读取性能,该性能针对Rowkey的查询能够到达毫秒级别
LSM树,树形结构,最末端的子节点是以内存的方式进行存储的,内存中的小树会flush到磁盘中(当子节点达到一定阈值以后,会放到磁盘中,且存入的过程会进行实时merge成一个主节点,然后磁盘中的树定期会做merge操作,合并成一棵大树,以优化读性能。)LSM树的介绍:https://www.cnblogs.com/yanghuahui/p/3483754.html

1.5 HBase的角色

1.5.1、HMaster

功能:
1) 监控RegionServer
2) 处理RegionServer故障转移
3) 处理元数据的变更
4) 处理region的分配或移除
5) 在空闲时间进行数据的负载均衡
6) 通过Zookeeper发布自己的位置给客户端

1.5.2、RegionServer

功能:
1) 负责存储HBase的实际数据
2) 处理分配给它的Region
3) 刷新缓存到HDFS
4) 维护HLog
5) 执行压缩
6) 负责处理Region分片
组件:
1) Write-Ahead logs
HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值
可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
2) HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
3) Store
HFile存储在Store中,一个Store对应HBase表中的一个列族。
4) MemStore
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。
5) Region
Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region。

1.6 HBase的架构

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,每个RegionServer维护一个HLog,和多个HFiles以及其对应的MemStore。RegionServer运行于DataNode上,数量可以与DatNode数量一致,请参考如下架构图:
一、HBaes介绍 - 图1

1.7数据模型

Rowkey timestamp info
name sex age
1001 version1 Thomas male 18
version2
1002 多个时间戳 Janna female 20

确定一个单元格的位置(cell),需要如下四个
rowkey + Colume Family + Colume + timestamp(版本version),数据有版本的概念,即一个单元格可能有多个值,但是只有最新得一个对外显示。

l HBase中有两张特殊的Table,-ROOT-和.META.
l .META.:记录了用户表的Region信息,.META.可以有多个region
l -ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region
l Zookeeper中记录了-ROOT-表的location
l Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过client端会做cache缓存,注意:在0.96版本后,Hbase移除了-ROOT-表
一、HBaes介绍 - 图2