欢迎投稿

今日深度:

HBase(07)——HBase读写过程,

HBase(07)——HBase读写过程,


读请求过程

(1) client通过zookeeper以及root表和meta表找到目标数据所在的regionserver
(2)联系regionserver查询目标数据所在region
(3)regionserver定位到目标数据所在的region,发出查询请求
(4)region先在memstore中查找,查找到则返回结果
(5)如果在memstore中没有查询到,则在storefile中扫描。(可能会扫描到很多的storefile----bloomfilter布隆过滤器)
——布隆过滤器:可以跳过不包含指定rowkey的storefile,快速定位到包含rowkey的目标文件。

写请求过程

(1)client向region server发起写数据请求
(2)region server找到目标region
(3)region检查数据是否与schema一致
(4)如果client没有指定版本,则获取当前系统时间作为数据版本(时间戳)
(5)将更新写入WAL log
(6)将更新写入Memstore
(7)判断Memstore的是否需要flush为StoreFile文件,如果需要,则将Memstore写入到磁盘。

数据在更新时首先写入Log(WAL log)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。同时,系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了。
当系统出现意外时,可能导致内存(MemStore)中的数据丢失,此时使用Log(WAL log)来恢复checkpoint之后的数据。
StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。
当一个Store中的StoreFile达到一定的阈值后(默认参数hbase.hstore.blockingStoreFiles=10),就会进行一次合并(minor_compact, major_compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后(hbase.hregion.max.filesize=10G),又会对 StoreFile进行split,等分为两个StoreFile。
由于对表的更新是不断追加的,合并时,**需要访问Store中全部的 StoreFile和MemStore,将他们按row key进行合并,**由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,合并的过程还是比较快。

www.htsjk.Com true http://www.htsjk.com/hbase/38484.html NewsArticle HBase(07)——HBase读写过程, 读请求过程 (1) client通过zookeeper以及root表和meta表找到目标数据所在的regionserver (2)联系regionserver查询目标数据所在region (3)regionserver定位到目标数据...
相关文章
    暂无相关文章
评论暂时关闭