HBase读取和存储数据的流程
一、HBase读取数据的流程
1、由客户端发起读取数据的请求, 首先先连接 zookeeper , 从zookeeper获取hbase:meta表被哪个regionServer所管理meta表中主要记录了 hbase中各个表有那些region,以及每个region被哪个regionServer所管理hbase中非常特殊的元数据存储表, 此表只会有一个region
2、连接meta对应的regionServer, 从meta中获取要查询数据的在那些region中, 并将其对应regionServer地址返回给客户端
3、开始并行的连接这些regionServer, 从这些regionServer中获取数据,先从 memStore --> blockCache ---> storeFile ---> 大的Hfile
4、各个regionserver将读取到数据返回给client , client根据需要过滤出需要的数据, 最后展示给调用者
二、HBase存储数据的流程
客户端的同步流程:
1、客户端发起写入数据的请求, 首先会先连接zookeeper, 从zookeeper获取hbase:meta表所在的regionServer的地址
2、连接meta表对应的regionServer, 从meta表获取目标表对应要写入数据的region的地址(基于region的startkey和endKey来确定)
3、连接对应region的regionServer的地址, 开始进行数据的写入
4、首先先将数据写入到这个regionServer的Hlog日志中, 然后在将数据写入到 对应的region中store模块的memStore中, 当这个两个地方都写入完成后, 客户端就会认为数据写入完成了
异步服务器端执行过程:
5、客户端不断的进行数据的写入工作, memStore数据也会不断的增多, 当memStore中数据达到一定的阈值(128M|1小时)后, 内部最终启动一个flush线程, 将数据刷新到HDFS上, 形成一个storeFile文件
6、随着memStore不断刷新数据到HDFS中, storeFile文件也会越来越多, 当storeFile的文件达到一定的阈值后(3个及以上), 启动compact线程, 将多个文件合并最终合并为一个大文件(Hfile)
7、随着不断的合并, 这个大的Hfile文件也会越来越大, 当这个大的Hfile达到一定的阈值(最终10GB)后, 启动split机制, 将大的Hfile一分为二的操作, 此时region也会进行分割操作, 变成两个新的region, 每个region管理每个分割后新的Hfile文件, 原有就得region就会被下线
8、随着不断的进行split, 表的region的数量也会越来越多的