2.HBase_存储与读写流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15014327/article/details/83303779

我们看到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文件。

猜你喜欢

转载自blog.csdn.net/qq_15014327/article/details/83303779