简介

本文将全面解析HBase中数据的存储过程,以及数据的查询解析过程,帮你从底层了解HBase内部的工作原理和工作流程。

一.HBase数据存储过程解析

先来看一张HBase存储过程的全貌图,下文将分为两个部分来讲解HBase的存储过程。

  • 客户端的请求提交过程
  • 数据到达服务器RegionServer后的过程

hbase 存储格式 hbase存储过程_HBase存储流程


(HBase的存储过程全貌示意图)


1.客户端的请求提交过程:

hbase 存储格式 hbase存储过程_Store Scanner_02


(HBase请求提交过程示意图)

①. 通过Zookeeper寻找到RegionServer的元数据表meta表所在的RegionServer地址。

②. 通过meta表信息中得Rowkey找到数据所属的RegionServer

③. 将用户提交的PutDelete请求,添加到本地Buffer中,当满足一定条件时,就会将数据异步批量到RegionServer中。

注意:
HBase默认设置的AutoFlushtrue,则Put请求直接提交给服务器处理;也可以设置为false,则Put请求则被放到本地的Buffer中,当Buffer超过默认阈值(2M,可修改)后,则进行提交。

2.数据到达服务器RegionServer后的过程

hbase 存储格式 hbase存储过程_hbase 存储格式_03


(数据到达服务器中的RegionServer后的过程示意图)

①. Region获得行锁(保证原子性),先写入HLog(WAL),再写入缓存MEMStore,在获得锁的时间里,不会同步数据到HDFS中。(上图左侧到中间部分)

②. 在Region释放行锁后,通过HLog Syncer同步数据到HDFS中。这样可以减少行锁时间,提高性能。若此时同步失败,则会将MEMStore中的数据删除,表示插入失败。(上图中间部分)

③. 当缓存值达到阈值(默认64M,可修改)时,将数据通过异步线程,写入到多个StoreFile中。

④. 当StoreFile数量达到一定数量,将进行Compaction合并,多个StoreFile合并为一个,同时进行版本合并和数据删除。

⑤. 当单个StoreFile超过一定阈值后,触发split操作,将当前Region分解为两个Region,HBase Master会将原来的Region下线,并将分解出的两个Region分配到两个不同的RegionServer上,实现负载均衡。(上图最右侧部分)

二.HBase数据读取过程解析

1.客户端的请求提交过程

同上文中"HBase数据存储过程解析"中的过程,这里不再赘述。其流程图如下所示:

hbase 存储格式 hbase存储过程_Store Scanner_04

2.数据到达服务器RegionServer后的过程

hbase 存储格式 hbase存储过程_hbase 存储格式_05


(Scanner体系图)

①. RegionServer接收到客户端的Get或者Scan请求后,构建一个RegionScanner。(上图左侧第一列)

②. RegionScanner根据列族去构建StoreScannerStoreScanner数量等于列族数)。(上图左侧第二列)

③. 每个StoreScanner为当前的StoreFile构造一个StoreFileScanner,用于执行文件检索。同时StoreScannerMemStore构建一个MemScanner(每个Store仅一个),用于执行对StoreMEMStore进行检索。

构建这两种Scanner是因为数据可能还没从内存中刷到HFile中,这两个Scanner可以对底层数据文件和内存中的数据进行检索(确保不遗漏数据),就可以找到需要的数据。(上图左侧第三列)

④. 将扫描得到的Key-Value封装为ResultSet结果集,返回给客户端。(上图左侧第四、五列)

总结

本文详细的讲解了HBase存储数据和读取数据的全过程,以及HBase中各个存储结构是怎样协作工作,完成存取流程的。本文涉及到的所有重要名词,在文章中都有超链接跳转到前几篇文章中的讲解部分,在本文中就无需赘述了。希望遇到不懂的名词可以配合前几篇文章一起阅读,这样可以理解的更快。

下一篇文章将讲解HBase的存储和读取的优化,喜欢本文请点赞收藏。