HBase get数据时如何定位Hfile?

如题,get数据的时候定位Region的过程我了解了,从Hfile中查找指定rowkey的数据我也了解了。但是有个问题是定位到Region后如何定位该条数据是在哪个Hfile中的?这个问题一直没找到满意的答案,希望能得到大家的指点。第二次提问了,很感谢@openinx 和 @hmaster 上一个问题的帮助!
已邀请:

libis - HBase爱好者

赞同来自: Figo

 rowkey可以存在在多个hfile中,理论上需要遍历所有的hfile去找对应的rowkey,但是这里有两个优化点:
1. 通过bloomfilter过滤掉部分肯定不存在的hfile,通过bloomfilter过滤掉的hfile是肯定不包含待查找rowkey的
2. 通过hfile文件的[startrow, endrow]来过滤一部分hfile,如果待查找rowkey不在这个范围,那肯定不在这个文件中。
 
通过这两个条件过滤之后可能还有一部分hfile,这个时候只能通过并行scan的方式每个hfile起一个scanner去查找,并且多个scanner会组成一个最小堆(最小的kv在堆顶端),这样一个kv一个kv去查找并检查,检查是检查get所带过滤器是否满足条件、时间戳是否在用户指定范围等

hmaster

赞同来自: Figo

基本上如范神说的一样。

补充一下HFile的信息是如何被RS感知的。
HRegion 对象内部会有一个StoreFileManager对象用来管理HFiles,flush 生成HFile或者HBase doBulkload过程中,会调用StoreFileManager的insertNewFiles/loadFiles方法将HFiles加载到StoreFileManager的List<
StoreFile> storeFiles对象中。加载前,还会构建Reader 信息读取HFile的信息,将HFile 一些基本信息,如[startkey,endkey],timestamp,fileinfo,rootIndex,statistics加载到StoreFile中。

对应的代码在Region以及HFile.Reader,StoreFileManager接口的实现类中。

有了上面的信息后,后面如何查找,请参看范神的答案

要回复问题请先登录注册