關於get和scan操作

get和scan是hbase中訪問數據最基本的兩個操作。get訪問一個指定key的數據,而scan可以設置begin和end來訪問一個範圍內所有的數據。

而通過查看相關代碼,原來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的表來說,性能應該會有很大的提升的。


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