HBase读写流程
写操作流程
(1) Client通过ZooKeeper的调度,向RegionServer发出写数据请求,在Region中写数据。
(2) 数据被写入Region的MemStore,直到MemStore达到预设阈值。
(3) MemStore中的数据被Flush成一个StoreFile。
(4) 随着StoreFile文件的不断增多,当其数量增长到一定阈值后,触发Compact合并操作,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除。
(5) StoreFiles通过不断的Compact合并操作,逐步形成越来越大的StoreFile。
(6) 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个新的Region。父Region会下线,新Split出的2个子Region会被HMaster分配到相应的RegionServer上,使得原先1个Region的压力得以分流到2个Region上。
可以看出HBase只有增添数据,所有的更新和删除操作都是在后续的Compact历程中举行的,使得用户的写操作只要进入内存就可以立刻返回,实现了HBase I/O的高性能。
读操作流程
(1) Client访问Zookeeper,查找-ROOT-表,获取.META.表信息。
(2) 从.META.表查找,获取存放目标数据的Region信息,从而找到对应的RegionServer。
(3) 通过RegionServer获取需要查找的数据。
(4) Regionserver的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache。
寻址过程:client–>Zookeeper–>-ROOT-表–>META表–>RegionServer–>Region–>client
HBase写流程
插入一条数据到某个表,因为HBase通过ZooKeeper协调,Client 首先连接ZooKeeper,从ZooKeeper中获取表Region相关信息。一般会获取HBase的Region的位置信息。大概步骤为:
- 从ZooKeeper中获取.ROOT.表的位置信息,在ZooKeeper的存储位置为/hbase/root-region-server
- 根据.ROOT.表中信息,获取.META.表的位置信息
- .META.表中存储的数据为每一个region存储位置
根据要插入的rowkey,获取指定的RegionServer信息,如果是批量提交的话,会把rowkey根据HRegion Location进行分组。
当得到了需要访问的Regionserver之后,Client会向对应的Regionserver发起写请求,并将对应的数据发送到该Regionserver检查操作,看Region是不是只读状态,BlockMemorySize大小限制等。
客户端向RegionServer端提交数据的时候,先记录在本