一、疑难描述
学习范欣欣大佬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.源码收获比读书更加有效,日常问题和源码相印证,收获会更多