1.HBase定义
HBase是一款分布式KV数据库系统。
2.HBase数据模型
HBase包含关系型数据库的基本概念:表、行、列。
但HBase的本质是一个Map,BigTable论文中是这么描述的“sparse、distributed、persistent multidimensional sorted map”。
2.1.HBase数据逻辑视图
从逻辑视图来看,HBase中的数据是以表形式组织的。
HBase逻辑视图包含以下概念
2.1.1.table
表,一个表包含多行数据。
2.1.2.row
行,一行数据包含一个唯一标识符rowkey、多个column以及对应的值。
HBase的一张表中,所有的row都按照rowkey的字典序从小到大排列。
2.1.3.column
列,与关系性数据库中的列不同,HBase中的列由column family(列簇)和qualifier(列名)两部分组成,两者之间通过冒号连接,命名规则为“列簇名:列名”。column family需要在表创建时指定,不能随意增减。一个column family可以设置任意多个qualifier,可动态增减qualifier。
2.1.4.timestamp
时间戳,每个cell在写入HBase的时候会默认分配一个时间戳作为该cell的版本。用户也可以在写入的时候自带时间戳。
HBase支持多版本特性,同一个rowkey和column下可以有多个value存在,这些value使用timestamp作为版本号,版本号越大,表示数据越新。
2.1.5.cell
单元格,由五元组组成的结构,即:row、column、timestamp、type、value。
type表示Put/Delete这样的操作类型,timestamp表示cell的版本。
这个结构实际是以K-V的形式存储的,其中(row、column、timestamp、type)为K,(value)是V。
2.2.HBase数据物理视图
从物理试图来看,HBase是一个Map,由Key-Value构成。与普通的Map不同,HBase是一个稀疏的、分布式的、多维排序的Map。
2.2.1.HBase与普通Map的对比
(1)多维:最大的不同在于HBase的key是一个复合结构,由多维元素构成,包括rowkey、column、timestamp、type。
(2)稀疏:其他数据库,对于null值,一般都是填充处理。而HBase中,null值不需要填充。如果填充null值,势必会造成大量存储空间的浪费。稀疏性是HBase列可无限扩展的重要条件。
(3)排序:构成HBase的KV在同一个文件中是有序的,排序规则不是简单按照rowkey排序,而是按照key来排序——rowkey、column family、qualifier、timestamp依次按顺序比较。
2.2.2.HBase列簇存储
首先我们来回答这个问题:为什么HBase要将数据按照列簇分别存储?
经典的有行存储和列存储。
行存储:行存储系统将一行数据存储在一起,一行数据写完后再接着写下一样行。行式存储在获取一行数据时是很高效的,但如果某个查询只需要获取某一行中的某些列数据,行存储就会在查找过程中引入大量无用列信息,导致大量内存被占用。
列存储:列存储系统会将同一列的数据存储在一起,不同列的数据分别集中存储。列式存储对只查找某些列的查询非常高效,但对一整行的请求就不那么高效了。
列簇存储就位于行存储和列存储之间,通过不同的设计思路在行存储和列存储之间进行相互转换。比如一个列簇包含表中所有的列,那就是行存储。如果一个列簇只包含某一列,那就是列存储。
3.HBase架构
HBase架构如下图所示:
这是个典型的Master-Slave模型,整个架构包含以下角色
3.1.HBase Client
HBase Client提供了Shell命令行接口、原生Java API编程接口、Thrift/Rest API编程接口、以及MapReduce编程接口。
HBase Client支持所有常见的DML和DDL操作。
Thrift/Rest API主要用于非Java的上层业务需求。
MapReduce接口主要用于批量数据导入以及批量数据读取。
3.2.Zookeeper
Zookeeper在HBase中扮演重要角色。
(1)实现HMaster高可用:通常情况下,HBase中只有一个HMaster工作,一旦Active HMaster宕机,Zookeeper会检测到该宕机事件,通过一定的选举机制选出新的Active HMaster,保证系统正常运行。
(2)管理系统核心元数据:比如管理当前系统中正常工作的RegionServer,保存系统元数据表hbase:meta所在的RegionServer地址等。
(3)参与RegionServer宕机恢复:ZooKeeper通过心跳可以感知到RegionServer是否宕机,并在宕机后通知HMaster进行宕机处理。
(4)实现分布式表锁:Hbase对一张表进行各种管理操作(比如alter)需要先加表锁,防止其他用户对同一张表进行管理操作,造成表状态不一致。和其他RDBMS表不同,HBase中的表通常都是分布式存储,Zookeeper可以通过特定机制实现分布式表锁。
3.3.HMaster
HMaster主要负责HBase系统的各种管理工作,包括:
(1)处理用户的各种管理请求,包括建表、修改表、权限操作、切分表、合并数据分片、以及Compaction等。
(2)管理集群中所有RegionServer,包括RegionServer中Region的负载均衡,RegionServer的宕机恢复,Region的迁移等。
(3)清理过期日志以及文件,HMaster会每隔一段时间检查HDFS中HLog是否过期,HFile是否已经被删除,并在过期之后将其删除。
3.4.HRegionServer
RegionServer主要用来响应用户的IO请求,是HBase中最核心的模块,由WAL(HLog)、BlockCache以及多个Region构成。
(1)HLog:HLog在Hbase中有两个核心作用,一个是实现数据的高可靠性,HBase数据随机写入时,并非直接写入HFile数据文件,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前优先顺序写入HLog,这样的话,即使缓存丢失,也可以通过HLog日志进行恢复。另一个是实现HBase集群间主从复制,通过回放主集群同步过来的HLog日志实现主从复制。
(2)BlockCache:HBase系统中的读缓存,客户端从磁盘读取数据后通常会将数据缓存到系统内存中,后续访问同一行数据可以直接从内存中获取而不需要访问磁盘。对于有大量热点读的业务请求来说,缓存机制会带来极大的性能提升。BlockCache有两种实现——LRUBlockCache和BucketCache,前者实现相对简单,后者在GC优化方面有明显提升。
(3)Region:数据表的一个分片,当数据表大小超过一定阈值时,就会水平切分,分裂为两个Region,Region是集群负载均衡的基本单位。通常一张表的多个Region会分布在HBase集群的多个RegionServer中。
3.5.HDFS
HBase底层依赖HBase存储数据,包括用户数据文件、HLog日志文件等最终都会写入HDFS。
HBase内部封装了DFSClient的HDFS客户端,负责对HDFS的读写访问。
4.HBase的特点
了解HBase的特点,有助于在业务系统选型时提供理论支撑。
4.1.HBase的优点
HBase在系统设计中有以下独特优点:
(1)容量大:HBase的单表可支持千亿行、百万列的数据规模,数据容量可以达到TB甚至PB级别。传统的关系性数据库,比如Oracle和Mysql等,如果单表记录数超过亿行,读写性能会急剧下降,HBase并不会出现这样的问题。
(2)良好的扩展性:HBase集群可以非常方便地实现集群容量扩展,主要包括数据存储结点扩展以及读写服务结点扩展。HBase底层数据存储依赖于HDFS系统,HDFS可以通过简单地增加DataNode实现扩展,HBase读写服务结点也一样,可以通过简单地增加RegionServer实现计算层的扩展。
(3)稀疏性:HBase支持大量稀疏存储,允许大量列值为空,并不占用任何存储空间。这与传统数据库不同,传统数据库对于空值的处理要占用一定的存储空间。
(4)高性能:HBase目前主要擅长OLTP场景,读写性能强劲,对于随机单点读以及小范围的扫描读,其性能也能得到保证。对于大范围的扫描读可以使用MapReduce提供的API,实现高效的并行扫描。
(5)多版本:HBase支持多版本特性,一个KV可以同时保留多个版本,用户可以根据需要选择更新版本或者某个历史版本。
(6)支持过期:HBase支持TTL过期特性,用户只需要设置过期时间,超过TTl的数据会被自动清理,不需要用户写程序手动删除。
(7)Hadoop原生支持:HBase是Hadoop生态中的核心成员之一,很多生态组件都可以与其对接。
4.2.HBase的缺点
HBase也有缺点,并不适合所有的场景。
(1)HBase本身不支持很复杂的剧和运算,比如Join、GroupBy等。如果业务中需要用到聚合运算,可以在HBase之上架设Phoenix或者Spark来完成。
(2)HBase本身并没有实现二级索引功能,所以不支持二级索引查找。好在针对HBase实现的第三方二级索引方案非常丰富,比如Phoenix提供的二级索引功能。
(3)HBase原生不支持全局跨行事务,只支持单行事务。同样,可以使用Phoenix提供的全局事务模型组件来弥补HBase的这个缺陷。