HBase读写数据流程

1.HBase读数据流程

HBase读写数据流程

[0].HBase的所有Region元数据被存储在.META.表中,随着Region的增多,.META.表中的数据也会增大,并分裂成多个新的Region。为了定位.META.表中各个Region的位置,把.META.表中所有Region的元数据保存在-ROOT-表中,HRegionServer 保存着 meta 表以及表数据

[1].所以要访问表数据,首先 Client 先去访问zookeeper,从 zookeeper 里面获取 -ROOT-表所在的位置信息

[2].根据-ROOT-找到.META.的元数据信息

[3].根据.META.的找到存放业务数据的Region

①.在MemStore(存放最近的写入数据)找,如果找到则返回

②.如果在MemStore中未找到该数据,则到BlockCache(根据LRUCache存放最近读取数据)中找,找到则返回

③.如果还未找到,则根据原数据信息查询HFile(hdfs),找到缓存到BlockCache并返回Client

[4].-ROOT-表永远不会被分割,它只有一个Region,这样可以保证最多只需要三次跳转就可以定位任意一个Region。为了加快访问速度,.META.表的所有Region全部保存在内存中。客户端会将查询过的位置信息缓存起来,且缓存不会主动失效。如果客户端根据缓存信息还访问不到数据,则询问相关.META.表的Region服务器,试图获取数据的位置,如果还是失败,则询问-ROOT-表相关的.META.表在哪里。最后,如果前面的信息全部失效,则通过ZooKeeper重新定位Region的信息。所以如果客户端上的缓存全部是失效,则需要进行6次网络来回,才能定位到正确的Region。

2.HBase写数据流程

HBase读写数据流程

[1].Client 也是先访问 zookeeper,找到 Meta 表,并获取 Meta 表信息。

[2].确定当前将要写入的数据所对应的 RegionServer 服务器和 Region。

[3].Client 向该 RegionServer 服务器发起写入数据请求,然后 RegionServer 收到请求并响应。

[4]Client 先把数据写入到 HLog,以防止数据丢失。

[5].然后将数据写入到 Memstore。

[6].如果 Hlog 和 Memstore 均写入成功,则这条数据写入成功。在此过程中,如果 Memstore达到阈值,会新开启一个Memstore,把旧的Memstore 中的数据放到一个队列(MapReduce中的实现是环形缓冲区)里面,按先进先出的原则将旧的Memstore依次flush 到 StoreFile(底层是HFile)中。

[7].当 Storefile 越来越多,会触发 Compact 合并操作,把过多的 Storefile 合并成一个大的Storefile。当 Storefile 越来越大,Region 也会越来越大,达到阈值后,会触发 Split 操作,将 Region 一分为二。

注意:因为内存空间是有限的,所以说溢写过程必定伴随着大量的小文件产生