我们看到HBase集群的物理模型,包括:Client、ZooKeeper、HMaster、HRegionServer、HLog、HRegion、Store、StoreFile、MemStore。对于HBase,它的元数据存放在ZooKeeper中,真实数据存放在MemFile(内存)和StoreFile(HDFS)中。
一. 写数据过程
(1) Client先把数据写入到HLog中。(HLog是标准的HadoopSequenceFile。由于Log数据量小,而且是顺序写,速度非常快)
(2) 同时把数据写到内存Memstore中,成功返回给Client。(HBase写的速度非常快,因为数据只要写到内存就算成功了)
(3) 然后检查Memstore是否已满。如果满了,HRegionServer会启动FlashCache进程,把内存中的MemStore刷新到HDFS,形成一个新的HFile。
(4) HFile是HBase使用的底层存储格式,HFile对应于列族,一个列族可以有多个HFile,但一个HFile不能存储多个列族的数据,HFile集合称作StroeFile。
(5) 当StoreFile文件的数量增长到一定的阈值后,系统就会进行合并,在合并过程中会进行版本合并和删除工作,形成更大的Storefile。
(6) 当StoreFile大小超过一定的阈值后,就会把当前的Region分割为两个Split,并由HMaster分配到相应的HRegionServer,实现负载均衡。
注意:
大型分布式系统中硬件故障很常见,HBase也不例外。
HBase通过在写动作发生之前先写入WAL(即:HLog)。
HBase集群中每台服务器维护一个WAL来记录发生的变化。
二. 读数据过程
- 由于无法直接修改HBase里的数据,所有的Update和Delete操作都转换成Append操作。而且HBase里也没有索引,因此读数据都是以Scan的方式进行。
- Client在读数据时,一般会指定TimeStamp和ColumnFamily。根据ColumnFamily和TimeStamp可以过滤掉很大一部分Store,然后在剩下的Store中Scan。
- 在ZooKeeper中有HBase的两个缺省命名空间:default和hbase。其中hbase中存放的都是系统内建表(用户创建的namespace和meta表);default中存放未指定命名空间的表。
(1) Client访问Zookeeper,查找META表信息。
(2) 从META表查找,获取存放目标数据的Region信息,从而找到对应的RegionServer。
(3) 通过RegionServer获取需要查找的数据。
(4) RegionServer的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache。
总结:Client–>Zookeeper–>META表–>RegionServer–>Region–>Client
三.HBase Admin(写数据时,合并Compaction过程)
- minor compaction:轻量级合并过程。将符合条件的一开始生成的多个storefile合并成一个大的storfile,此时不会删除被标记为"delete"的数据和已经过期的数据。执行一次minor合并操作后,还会有多个storefile文件。
- major compaction:重量级合并过程。把所有storefile合并成单一的storefile文件,在合并过程中会把标记为"删除"的数据和过期数据一并删除。合并过程中,对请求该Region的所有客户端阻塞,直到合并完毕。最后删除参与合并的(小)storefile文件。