HBase是一个基于HDFS的分布式、面向列的数据库系统,适合用于实时读写和随机访问大规模数据的场景。

高可靠:因为底层数据写在HDFS上,保证了HBase的高可靠。

面向列:HBase引入了列族的概念,将相同列族的数据在物理上保存在一起,且不保存NULL,所以在空间利用上更高

高性能:HBase以rowKey为一级索引实现了简单的查询逻辑,并且通过多线程读写数据,保证了高性能读写。HBase的写性能比读更好。

可伸缩:HBase的节点扩展方便,但扩展时需要重启HBase

 

HBase的架构模型

HBase的角色主要包括HMaster和HRegionServer,另外还依赖zookeeper提供的分布式协调和分布式锁的服务,以及HDFS提供的存储服务。

HRegionServer主要负责管理Hmaster所分配的region,以及实现客户端的读写请求。

HMaster主要负责region的分配和再分配,以及HregionServer的负载均衡,更新表的Schema

 

HBase数据的逻辑模型

HBase以表的形式存储数据,表的Schema包括rowKey和列族,数据在表中按照rowkey以字典序排序,rowkey作为一级索引索引一条记录。列族相当于关系型数据库中的列,HBase在插入数据时将列名(Colume)作为内容一起插入到表中,一个列族内可以插入任意且不相同的列,一般我们将经常需要一起查询的列存于同一个列族中,便于查询。

 

HBase数据的物理模型

HBase表在横向上被划分为多个region(一般来说刚建表时只有一个region,随着插入数据的增多,达到一定的阈值,就会切分成两个region,也可以在创建表时预分region),region是负载均衡的最小单位。每个region交给一个HRegionServer来管理,一个HRegionServer可以管理多个region。region由一个HLog、一个或者多个Store组成,HLog用于存储用户的读写操作行为,每个store保存一个columns family。Store有一个内存缓冲区MemStore,用于存储写入的数据,当大到一定的阈值时,就会刷新到一个StoreFile中,Store数量增多到一定时会合并为一个Store,StoreFile以HFile的形式向HDFS写 数据。HBase以store的大小来判断是否需要切分region。HFile的数据是key-value,以二进制格式存储。

MemStore

memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值(默认64MB)时,memStore会被flush到文件,即生成StoreFile。目前hbase 会有一个线程来负责memStore的flush操作。

 

HBASE检索记录

1、通过单个row key访问:即按照某个row key键值进行get操作;

2、通过row key的range进行scan:即通过设置startRowKey和endRowKey,在这个范围内进行扫描;

3、全表扫描:即直接扫描整张表中所有行记录。

 

HBase的写流程

首先寻址,由于Zookeeper中存储了-ROOT-表的地址和HMaster的地址,所以需要先到Zookeeper上进行寻址。最终定位到所操作字段在的region,连接用户表的region所在的HRegionServer(可以将元数据缓存在客户端)。接下来用户就可以对表进行读写了,当写数据时,会先将要做的记录变更以key-value的形式记录在HLog中,然后将数据写入到memStore中,并通知客户端写入成功。Region这边,当memStore的大小大到一个阈值(默认64MB)时,memStore会被flush到一个文件生成一个StoreFile,随着StoreFile增多,之后会触发Compact操作,将多个StoreFile合并成一个大的StoreFile。当这个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前Region Split成2个Region,这时旧的Region会下线,新Split出的2个Region会被HMaster分配到相应的HregionServer上,使得原先1个Region的压力得以分散到2个Region上,同时修改.meta.表上的索引。写完数据后,删除 HLog信息。

Hlog中保存着多个region的记录变更信息,需要持久化到磁盘,若一台RegionServer宕机,则其上未操作的记录变更信息就会被拆分,分别放到相应Region的目录下,然后再将失效的Region重新分配,领取到这些Region的Regionserver在Load Region的过程中,会发现历史HLog需要处理,因此Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

 

HBASE读流程

Client连接zookeeper,通过Rowkey寻址到一个RegionServer,连接,先从MemStore查找数据,没有的话从磁盘文件读取

 

HBase表设计

表设计

预分region,识别可能存在的热点key区域,将该区域分为多个region存储

Rowkey设计

1、设计表的rowkey最好包含源表的key字段

2、Rowkey设计在排序上必须与查询条件契合,尽量将权重高离散性好的字段放前面,如果RowKey是按时间戳的方式递增,建议不要将时间字段放前面

3、保证rowkey唯一,需要同时查询的数据Rowkey尽量连续

4、Rowkey的长度越短越好

列族和列设计

1、同一个列族的数据物理上存在一起,所以尽量将经常同时查询的数据放在同一列族

2、均衡每个列族的数据量,不同的的列族设置不同的属性

3、HFile里的KeyValue对象存储列族名字,使用短的列族名字以减少硬盘和网络I/O

HBase没有跨行事务的概念,要避开在客户端代码里需要事务逻辑的设计