HFile數(shù)據(jù)完整索引流程

1:數(shù)據(jù)不大的時(shí)候只有一層。
2:數(shù)據(jù)多的時(shí)候有且最多三層。
3:最下面一層為數(shù)據(jù)層。
圖中紅線表示一次查詢的索引過(guò)程(HBase中相關(guān)類為HFileBlockIndex和HFileReaderV2),基本流程可以表示為:
1. 用戶輸入rowkey為fb,在root index block中通過(guò)二分查找定位到fb在’a’和’m’之間,因此需要訪問(wèn)索引’a’指向的中間節(jié)點(diǎn)。因?yàn)閞oot index block常駐內(nèi)存,所以這個(gè)過(guò)程很快。
2. 將索引’a’指向的中間節(jié)點(diǎn)索引塊加載到內(nèi)存,然后通過(guò)二分查找定位到fb在index ‘d’和’h’之間,接下來(lái)訪問(wèn)索引’d’指向的葉子節(jié)點(diǎn)。
3. 同理,將索引’d’指向的中間節(jié)點(diǎn)索引塊加載到內(nèi)存,一樣通過(guò)二分查找定位找到fb在index ‘f’和’g’之間,最后需要訪問(wèn)索引’f’指向的數(shù)據(jù)塊節(jié)點(diǎn)。
4. 將索引’f’指向的數(shù)據(jù)塊加載到內(nèi)存,通過(guò)遍歷的方式找到對(duì)應(yīng)的keyvalue。
上述流程中因?yàn)橹虚g節(jié)點(diǎn)、葉子節(jié)點(diǎn)和數(shù)據(jù)塊都需要加載到內(nèi)存,所以io次數(shù)正常為3次。但是實(shí)際上HBase為block提供了緩存機(jī)制,可以將頻繁使用的block緩存在內(nèi)存中,可以進(jìn)一步加快實(shí)際讀取過(guò)程。所以,在HBase中,通常一次隨機(jī)讀請(qǐng)求最多會(huì)產(chǎn)生3次io,如果數(shù)據(jù)量?。ㄖ挥幸粚铀饕?,數(shù)據(jù)已經(jīng)緩存到了內(nèi)存,就不會(huì)產(chǎn)生io。