微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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上面。

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐