而通過查看相關代碼,原來get操作就是一種特殊的scan,begin和end相同的scan操作。
HRegion.java中的get方法是對get操作的處理,代碼的最開始進行了轉化,如下:
private List<KeyValue> get(Get get, boolean withCoprocessor)
throws IOException {
Scan scan = new Scan(get);
通過Scan的構造方法,將get轉化爲scan,該構造方法如下:
public Scan(Get get) {
this.startRow = get.getRow();
this.stopRow = get.getRow();
this.filter = get.getFilter();
this.cacheBlocks = get.getCacheBlocks();
this.maxVersions = get.getMaxVersions();
this.tr = get.getTimeRange();
this.familyMap = get.getFamilyMap();
}
可以看得出來,get轉化爲startRow和stopRow相同的scan操作。
從另一個角度來看,hbase讀數據的操作都是scan,代碼級別實現的是scan,而並沒有特別針對get的操作。那麼原來可以對get進行的一些優化實際上都是沒有做的,所有的實現都是針對scan。所以,我們可以對hbase做些改造,讓其更適合get的操作。對於store中有多個hfile的表來說,性能應該會有很大的提升的。