HBase的读写数据流程

写流程:

 

具体流程:

  Client进行写操作的时候,会先查询Meta缓存中是否含有目标table的region信息以及Meta表位置信息,如果有就不再去访问zookeeper,而是直接进行下一步的操作。如果没有则会去访问zookeeper,获取hbase:meta表位于哪个Region Server。Meta表主要用于存储用户表和系统表的所在位置。在低版本的时,会有一个-ROOT-表,用于存储meta表的位置信息,这个操作主要是为了预防meta表过大而需要对meta表进行切分,切分之后就会造成有多个meta表,这就需要一个表准们存储meta表的位置信息;

  获取到meta的位置信息以后,会去访问对应的Region Server,根据读请求的信息namespace:table/rowkey,查询处目标数据位于哪个Region Server中的哪个Region。并将该table的region信息以及meta表的位置信息缓存到客户端的meta cache,方便下次访问;

  然后与得到的RegionServer通讯,将数据顺序写入(append)到WAL,此时并不进行同步操作,即并不将wal写到hdfs

  将数据写入对应Region的memstore中,数据会在MemStore中进行排序;

  同步wal,将wal写到hdfs,如果不能同步成功则会进行回滚操作。wal和数据写入到memstore是一个整体的事务,要么都成功要么都失败;

  上面成功后,向客户端发送ack;

  等达到MemStore的刷写时机后,将数据刷写到HFile中。

 

读流程

  

 

 

具体步骤:

 

 1)Client 先访问zookeeper,获取hbase:meta 表位于哪个Region Server。

 2)访问对应的Region Server,获取hbase:meta 表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。

   3)与目标Region Server进行通讯;

   4)分别在Block Cache(读缓存),MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。

   5) 将从文件中查询到的数据块(Block,HFile 数据存储单元,默认大小为64KB)缓存到Block Cache。

   6)将合并后的最终结果返回给客户端。

 

  需要注意的是,读数据的时候,block cache、memstore、storefile中的数据要一起读,读出来之后要做merge(合并),merge的过程中要比较所有读出的数据的时间戳,谁的时间戳大,就返回哪一条数据。此时,磁盘和内存是一起读的,磁盘中的数据读出来之后会放入block cache中,所以,读流程无论如何都会扫描磁盘,也就造成了HBase的读流程要慢于写流程。

  从读写流程的两幅流程图可以看出,HMaster好像并没有参与整个的读写流程,其实Master可以完全不参与读写流程,因为读写数据所需的meta表位置信息是存储在zookeeper的,zookeeper担任了一部分Master与客户端的交互的功能,所以即使Master挂掉了,用户也可以在客户端进行读写。但是如果Master一直处于挂掉的状态,对于HBase集群来说是非常不健康的,比如集群中某个RegionServer出故障挂掉了,那么就无法及时将该RegionServer上的Region转移到其他健康的RegionServer上面。

 

posted @ 2020-08-15 06:34  有心有梦  阅读(1379)  评论(0编辑  收藏  举报