(一)HBase的特性和架构

HBase是一个高可靠,高可用,高性能,面向列,可伸缩,支持海量的数据存储的分布式数据库。本文主要学习一下HBase的主要特性和HBase架构。

HBase特性

1、海量存储:单表可以存储百亿级别的量级,不用担心读取的性能下降。
2、面向列:数据在表中是按某列的数据聚集存储,数据即索引,只访问查询涉及的列时,可以大量降低系统的I/O
3、稀疏性:传统行数存储的数据存在大量NULL的列,需要占用存储空间,造成存储空间的浪费,而HBase为空的列并不占用空间,因此表可以设计的很稀疏
4、扩展性:HBase底层基于HDFS,支持扩展,并且可以随时添加或者减少节点。
5、高可靠:基于zookeeper的协调服务,能够保证服务的高可用行。HBase使用WAL和replication机制,前者保证数据写入时不会因为集群异常而导致写入数据的丢失,后者保证集群出现严重问题时,数据不会发生丢失和损坏。
6、高性能:底层的LSM数据结构,使得HBase具备非常高的写入性能。RowKey有序排列、主键索引和缓存机制使得HBase具备一定的随机读写性能。

HBase架构

HBase采用Master/Slave架构搭建集群,它隶属于Hadoop生态系统,由以下类型节点组成:HMaster节点、HRegionServer节点、ZooKeeper,操作HBase的client模块,而在底层,它将数据存储于HDFS中,因而涉及到HDFS的NameNode、DataNode等。总体结构如下:

客户端client

用户主要通过client操作HBase,主要包括两个部分:
1、管理操作,client与HMaster通信,负责一下集群的管理,如表的创建和维护等
2、CURD操作,client与HRegionServer通信,负责数据读写类的操作。
除HBase Client API外,Thrift、Rest等也可以算作client。client支持Java/Python等语言

HMaster

HMaster主要负责Table和RegionServer的操作:
1、管理用户对Table的CURD操作
2、管理HRegionServer
3、调整Region分布,新Region的分配,宕机后Region的迁移

ZooKeeper集群

ZooKeeper主要负责HMaster的选举,存储HBase的元数据类型,监控RegionServer和存放Region的地址,便于Client快速获取Region地址。

HRegionServer

HRegionServer 是HBase最重要的部分。HRegionServer主要负责响应用户的I/O请求,对Table的CURD操作。HRegionServer内部管理了多个Region,每个Region是由HLog和多个HStore组成的,对应着Table中的一个Region。架构如如下:

HStore是HBase存储的核心,每个HStore对应Table中的一个Column Family的存储,由两部分组成:MemStore和StoreFile。MemStore是一个写缓冲区,用户写入的数据首先会被放入MemStore中,当MemStore满了就会flush成一个StoreFile。达到一定数量的StoreFile后,会触发compact操作,将多个StoreFile合并成一个更大的StoreFile,在合并的过程中会进行版本的合并和数据的删除。当单个StoreFile大到一个阈值时(跟Region的maxSize相关),就会进行split操作。将Region分裂成两个Region,父的Region会下线,新分裂的两个Region会被HMaster分配到相应的HRegionServer上。compact和split示意图:

HLog是一个日志文件,在每次数据写入MemStore的同时,也会写一份数据到HLog文件中。HMaster通过Zookeeper感知到HRegionServer宕机时,会首先处理遗留的HLog文件,将不同的Region的Log数据进行拆分,分别放到对应的Region中,然后再将失效的Region重新分配。当HRegionServer获取到失效的Region时,首先会处理HLog文件,将HLog中的数据回放到MemStore中,然后flush到StoreFile,完成数据恢复。