HBase(2.4)-HBase读写操做、root和meta表

1. HBase读写流程web

这里写图片描述
上图是RegionServer数据存储关系图。上文提到,HBase使用MemStore和StoreFile存储对表的更新。数据在更新时首先写入HLog和MemStore。MemStore中的数据是排序的,当MemStore累计到必定阈值时,就会建立一个新的MemStore,而且将老的MemStore添加到Flush队列,由单独的线程Flush到磁盘上,成为一个StoreFile。与此同时,系统会在Zookeeper中记录一个CheckPoint,表示这个时刻以前的数据变动已经持久化了。当系统出现意外时,可能致使MemStore中的数据丢失,此时使用HLog来恢复CheckPoint以后的数据。
StoreFile是只读的,一旦建立后就不能够再修改。所以Hbase的更新实际上是不断追加的操做。当一个Store中的StoreFile达到必定阈值后,就会进行一次合并操做,将对同一个key的修改合并到一块儿,造成一个大的StoreFile。当StoreFile的大小达到必定阈值后,又会对 StoreFile进行切分操做,等分为两个StoreFile。缓存

1.1 写操做流程
(1) Client经过Zookeeper的调度,向RegionServer发出写数据请求,在Region中写数据。
(2) 数据被写入Region的MemStore,直到MemStore达到预设阈值。
(3) MemStore中的数据被Flush成一个StoreFile。
(4) 随着StoreFile文件的不断增多,当其数量增加到必定阈值后,触发Compact合并操做,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除。
(5) StoreFiles经过不断的Compact合并操做,逐步造成愈来愈大的StoreFile。
(6) 单个StoreFile大小超过必定阈值后,触发Split操做,把当前Region Split成2个新的Region。父Region会下线,新Split出的2个子Region会被HMaster分配到相应的RegionServer上,使得原先1个Region的压力得以分流到2个Region上。
能够看出HBase只有增添数据,全部的更新和删除操做都是在后续的Compact历程中举行的,使得用户的写操做只要进入内存就能够马上返回,实现了HBase I/O的高性能。服务器

1.2 读操做流程
(1) Client访问Zookeeper,查找-ROOT-表,获取.META.表信息。
(2) 从.META.表查找,获取存放目标数据的Region信息,从而找到对应的RegionServer。
(3) 经过RegionServer获取须要查找的数据。
(4) Regionserver的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache。
寻址过程:client–>Zookeeper–>-ROOT-表–>META表–>RegionServer–>Region–>client网络

2.ROOT表和META表
2.1 -ROOT-表结构
HBase的用-ROOT-表来记录.META.的Region信息,就和.META.记录用户表的Region信息如出一辙。-ROOT-只会有一个Region。
这么一来Client端就须要先去访问-ROOT-表。因此须要知道管理-ROOT-表的RegionServer的地址。这个地址被存在ZooKeeper中。默认的路径是:
/hbase/root-region-server
这里写图片描述svg

2.2 .META.表结构
这里写图片描述性能

2.3 两个表的关系
HBase的全部Region元数据被存储在.META.表中2.1,随着Region的增多,.META.表中的数据也会增大,并分裂成多个新的Region。为了定位.META.表中各个Region的位置,把.META.表中全部Region的元数据保存在-ROOT-表中,最后由Zookeeper记录-ROOT-表的位置信息。全部客户端访问用户数据前,须要首先访问Zookeeper得到-ROOT-的位置,而后访问-ROOT-表得到.META.表的位置,最后根据.META.表中的信息肯定用户数据存放的位置,以下图所示。
这里写图片描述
-ROOT-表永远不会被分割,它只有一个Region,这样能够保证最多只须要三次跳转就能够定位任意一个Region。为了加快访问速度,.META.表的全部Region所有保存在内存中。客户端会将查询过的位置信息缓存起来,且缓存不会主动失效。若是客户端根据缓存信息还访问不到数据,则询问相关.META.表的Region服务器,试图获取数据的位置,若是仍是失败,则询问-ROOT-表相关的.META.表在哪里。最后,若是前面的信息所有失效,则经过ZooKeeper从新定位Region的信息。因此若是客户端上的缓存所有是失效,则须要进行6次网络来回,才能定位到正确的Region。线程