Hbase Region定位
2017年3月4日
15:36
获取每个table的row对应的locate,具体实现如下:
1、调用locateRegionInMeta函数,首先查找cache中是否有table对应的row,比较缓存中的Table对应的startkey与endkey,判断row是否在某个region中;若能找到,直接返回该regionlcation信息
2、若cache没有开启或cache为空或没有找到,则需要构造一个metakey,该metakey是用来在meta表中查找Regionlocation的rowkey,构造rowkey=tableName+startkey+9999999999999+encode
3、在尝试次数范围内,清空metaCache中的对应本次查询的tableName和row的信息;
metaCache.clearCache(tableName,row);
4、重新获取metaLocation
metaLocation=locateRegion(TableName.META_TABLE_NAME,metaKey,false,false);
4.1、从ZK中获取metaLocation信息
this.registry.getMetaRegionLocation();
4.2、从ZK的meta-region-server节点获取当前metaLocation信息
4.3、将获取到的metaLocation对应的ServerName返回
5、构造ClientService请求服务
ClientService.BlockingInterfaceservice=getClient(metaLocation.getDefaultRegionLocation().getServerName());
6、调用getRowOrBefore获取metakey在metaInfo中对应的RegionServer信息
6.1、首先构造一个GetRowOrBeforeRequest请求
6.2、通过ClinetService将GetRowOrBeforeRequest请求发送
6.3、根据request中的Region以及row和family,调用如下函数:
r=region.getClosestRowBefore(row,family);
6.3.1、获取family对应的Store
Storestore=getStore(family);
6.3.2、首先先去memstore中获取rowkeyCandidate
this.memstore.getRowKeyAtOrBefore(state);
6.3.3、逐个遍历Store中所有StoreFiles,如果能找到metakey的candidate,则比较此次找到的是否是最接近的
6.3.4、返回最接近的candidate
6.4、将结果r返回