1、HBase写流程
1.获取meta表的RootRegion位置信息
在客户端写进程时,第一次写时,Client先通过Zookeeper获取到Meta表对应的region位置信息,然后加入到进程缓存中,后续再读写时,直接读取缓存的meta信息对应的region信息就行.
2.找到数据要写在哪个region上
根据获取到的RootRegion位置信息,请求region所在的region server服务,根据namespace(相当于数据库名),表名和rowkey在meta表中找到写入数据对应的region信息.
找到最大的小于需要找的rowkey的那个rowkey对应的region,这个region就是目标region信息
3.发起实际的写入请求
向region对应的region server发起写入请求
4.WAL log写入
将插入/更新写入WAL中,当客户端发起put/delete请求时,考虑到写入内存会有丢失数据的风险,因此在写入缓存前,HBase会先写入到WAL中(WAL存储在HDFS上), 那么即使发生宕机,也可以通过WAL还原初始数据.
5.memstore写入与StoreFile落地
将更新写入memstore中,当这个内存达到预设的阈值,会触发flush memstore,把memstore中的数据写出到hdfs上,生成一个storefile.
6.StoreFile合并
随着Storefile文件的不断增多,当增长到一定阈值后,会触发compact合并操作,将多个storefile合并成一个,同时会删除旧版本.
store通过不断的compact合并,逐步形成更大的storefile
7.Region拆分
单个storefile大小超过阈值后,会触发split操作,把当前region拆分成两个,新拆分的2个region会被HMaster分配到相应的两个regionserver上,有可能是当前的regionserver,也有可能是别的.
2、HBase读流程
1.获取meta表的RootRegion位置信息
在客户端写进程时,第一次写时,Client先通过Zookeeper获取到Meta表对应的region位置信息,然后加入到进程缓存中,后续再读写时,直接读取缓存的meta信息对应的region信息就行.
2.找到数据要写在哪个region上
根据获取到的RootRegion位置信息,请求region所在的region server服务,根据namespace(相当于数据库名),表名和rowkey在meta表中找到写入数据对应的region信息.
找到最大的小于需要找的rowkey的那个rowkey对应的region,这个region就是目标region信息
3.发起实际的写入请求
向region对应的region server发起读取请求
4.先从memstore中查找数据,如果找到则返回
5.再从BlockCache查找数据,如果找到就返回
6. 再从StoreFile中查找数据,如果找到则返回,如果没有找到则返回null,
如果是从StoreFile中读取到的数据,则要写入BlockCache后再返回给客户端