HBase存储和读取流程详解
简介
本文将全面解析HBase中数据的存储过程,以及数据的查询解析过程,帮你从底层了解HBase内部的工作原理和工作流程。
一.HBase数据存储过程解析
先来看一张HBase存储过程的全貌图,下文将分为两个部分来讲解HBase的存储过程。
- 客户端的请求提交过程
- 数据到达服务器RegionServer后的过程
1.客户端的请求提交过程:
①. 通过Zookeeper
寻找到RegionServer
的元数据表meta
表所在的RegionServer
地址。
②. 通过meta
表信息中得Rowkey
找到数据所属的RegionServer
。
③. 将用户提交的Put
或Delete
请求,添加到本地Buffer
中,当满足一定条件时,就会将数据异步批量到RegionServer
中。
注意:
HBase默认设置的AutoFlush
为true
,则Put
请求直接提交给服务器处理;也可以设置为false
,则Put
请求则被放到本地的Buffer
中,当Buffer
超过默认阈值(2M,可修改)后,则进行提交。
2.数据到达服务器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数据存储过程解析"中的过程,这里不再赘述。其流程图如下所示:
2.数据到达服务器RegionServer后的过程
①. RegionServer
接收到客户端的Get
或者Scan
请求后,构建一个RegionScanner
。(上图左侧第一列)
②. RegionScanner
根据列族去构建StoreScanner
(StoreScanner
数量等于列族数)。(上图左侧第二列)
③. 每个StoreScanner
为当前的StoreFile
构造一个StoreFileScanner
,用于执行文件检索。同时StoreScanner
对MemStore
构建一个MemScanner
(每个Store仅一个),用于执行对Store
中MEMStore
进行检索。
构建这两种Scanner
是因为数据可能还没从内存中刷到HFile
中,这两个Scanner
可以对底层数据文件和内存中的数据进行检索(确保不遗漏数据),就可以找到需要的数据。(上图左侧第三列)
④. 将扫描得到的Key-Value
封装为ResultSet
结果集,返回给客户端。(上图左侧第四、五列)
总结
本文详细的讲解了HBase存储数据和读取数据的全过程,以及HBase中各个存储结构是怎样协作工作,完成存取流程的。本文涉及到的所有重要名词,在文章中都有超链接跳转到前几篇文章中的讲解部分,在本文中就无需赘述了。希望遇到不懂的名词可以配合前几篇文章一起阅读,这样可以理解的更快。
下一篇文章将讲解HBase的存储和读取的优化,喜欢本文请点赞收藏。