HFile數(shù)據(jù)完整索引流程
1:數(shù)據(jù)不大的時候只有一層。
2:數(shù)據(jù)多的時候有且最多三層。
3:最下面一層為數(shù)據(jù)層。
圖中紅線表示一次查詢的索引過程(HBase中相關(guān)類為HFileBlockIndex和HFileReaderV2),基本流程可以表示為:
1. 用戶輸入rowkey為fb骗随,在root index block中通過二分查找定位到fb在’a’和’m’之間,因此需要訪問索引’a’指向的中間節(jié)點赴叹。因為root index block常駐內(nèi)存鸿染,所以這個過程很快。
2. 將索引’a’指向的中間節(jié)點索引塊加載到內(nèi)存乞巧,然后通過二分查找定位到fb在index ‘d’和’h’之間涨椒,接下來訪問索引’d’指向的葉子節(jié)點。
3. 同理绽媒,將索引’d’指向的中間節(jié)點索引塊加載到內(nèi)存蚕冬,一樣通過二分查找定位找到fb在index ‘f’和’g’之間,最后需要訪問索引’f’指向的數(shù)據(jù)塊節(jié)點是辕。
4. 將索引’f’指向的數(shù)據(jù)塊加載到內(nèi)存囤热,通過遍歷的方式找到對應的keyvalue。
上述流程中因為中間節(jié)點获三、葉子節(jié)點和數(shù)據(jù)塊都需要加載到內(nèi)存旁蔼,所以io次數(shù)正常為3次。但是實際上HBase為block提供了緩存機制疙教,可以將頻繁使用的block緩存在內(nèi)存中棺聊,可以進一步加快實際讀取過程。所以松逊,在HBase中躺屁,通常一次隨機讀請求最多會產(chǎn)生3次io肯夏,如果數(shù)據(jù)量芯辍(只有一層索引),數(shù)據(jù)已經(jīng)緩存到了內(nèi)存驯击,就不會產(chǎn)生io烁兰。