一、概述
- 先从Zookeeper中找到meta表所在的Regionserver的信息
- 根据namespace、表名、以及rowKey查找数据所在的RegionServer的信息,向对应的regionServer建立连接并发起读取数据请求;
- Regionserver会先从MemStore上找,再从SotreFile(先CacheBlocks再HFile)上读取数据。
二、图解
三、扩展
1、为什么不把META表信息直接保存在ZK中?
ZK中不宜保存大量数据,而META表主要是保存Region和RegionServer的映射信息,Region的数量没有具体约束,只要在内存允许的范围内,Region数量可以有很多,如果保存在ZK中,ZK的压力会很大。通过一个ROOT-表来转存到RegionServer中是一个比较理想的方案,相比直接保存在ZK中,也就多了一层-ROOT-表的查询,对性能来说影响不大。
2、每次访问都需要走ZK –> -ROOT- —> .META.的流程么?
不需要,Client端有缓存,第一次查询到相应region所在RS后,这个信息将被缓存到Client端,以后每次访问都直接从缓存中获取RS地址即可。当然这里有个意外:访问的region若果在RS上发生了改变,比如被balancer迁移到其他RS上了,这个时候,通过缓存的地址访问会出现异常,在出现异常的情况下,Client需要重新走一遍上面的流程来获取新的RS地址。总体来说,region的变动只会在极少数情况下发生,一般变动不会很大,所以在整个集群访问过程中,影响可以忽略。