HBase:不同KeyValue之間如何進行大小比較,爲什麼Timestamp新的大,反而比較小?

一、疑難描述

學習範欣欣大佬Hbase的讀取流程博客,將本地HFile通過StoreFileScanner和MemstoreScanner合併形成一個heap(最小堆),所謂heap是一個優先級隊列,隊列中元素是所有scanner,排序規則按照scanner seek到的keyvalue大小由小到大進行排序。但是,對keyvalue大小排序規則有些疑問,博客中提及:不同KeyValue之間如何進行大小比較?是採用如下策略:

上文提到KeyValue中Key由RowKey,ColumnFamily,Qualifier ,TimeStamp,KeyType等5部分組成,HBase設定Key大小首先比較RowKey,RowKey越小Key就越小;RowKey如果相同就看CF,CF越小Key越小;CF如果相同看Qualifier,Qualifier越小Key越小;Qualifier如果相同再看Timestamp,Timestamp越大表示時間越新,對應的Key越小。如果Timestamp還相同,就看KeyType,KeyType按照DeleteFamily -> DeleteColumn -> Delete -> Put 順序依次對應的Key越來越大。

疑問在於:爲什麼Timestamp新的大,反而比較小?

二、解答

查看源碼org.apache.hadoop.hbase.KeyValue,如下圖。沒辦法,源碼就是這麼寫的,這樣寫最終的目的就是因爲 StoreFileScanner 合併爲最小堆,而最新的版本Timestamp大,但是比較起key卻比舊的小,所以可以放到最頂層。所以,提取的時候可以取到最新的。

三、總結

1.源碼收穫比讀書更加有效,日常問題和源碼相印證,收穫會更多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章