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.源码收获比读书更加有效,日常问题和源码相印证,收获会更多

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