get和scan是hbase中访问数据最基本的两个操作。get访问一个指定key的数据,而scan可以设置begin和end来访问一个范围内所有的数据。
通过Scan的构造方法,将get转化为scan,该构造方法如下:
可以看得出来,get转化为startRow和stopRow相同的scan操作。
而通过查看相关代码,原来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的表来说,性能应该会有很大的提升的。