时间:2021-07-01 10:21:17 帮助过:13人阅读
HBase源码分析之GET操作之get转化为scan 1,还是先看构造函数 public Get(byte [] row) { this(row, null); } public Ge
HBase源码分析之GET操作之get转化为scan
1,还是先看构造函数
public Get(byte [] row) {
this(row, null);
}
public Get(byte [] row, RowLock rowLock) {
this.row = row;
if(rowLock != null) {
this.lockId = rowLock.getLockId();
}
}
public Get addFamily(byte [] family) {
familyMap.remove(family);
familyMap.put(family, null);
return this;
}
public Get addColumn(byte [] family, byte [] qualifier) {
NavigableSet
if(set == null) {
set = new TreeSet
}
set.add(qualifier);
familyMap.put(family, set);
return this;
public Get addColumn(final byte [] column) {
if (column == null) return this;
byte [][] split = KeyValue.parseColumn(column);
if (split.length > 1 && split[1] != null && split[1].length > 0) {
addColumn(split[0], split[1]);
} else {
addFamily(split[0]);
}
return this;
}
2,HTable.java 里的get方法,,实则是调用了HregionServer的get方法。
public Result get(final Get get) throws IOException {
return connection.getRegionServerWithRetries(
new ServerCallable
public Result call() throws IOException {
return server.get(location.getRegionInfo().getRegionName(), get);
}
}
);
}
3,再来看看HregionServer.java
/** {@inheritDoc} */
public Result get(byte[] regionName, Get get) throws IOException {
checkOpen();
requestCount.incrementAndGet();
try {
HRegion region = getRegion(regionName);
return region.get(get, getLockFromId(get.getLockId()));
} catch (Throwable t) {
throw convertThrowableToIOE(cleanup(t));
}
}
再来看看Hregion的get方法:
1),首先是检测family,保证Table中的family与get中的一致
public Result get(final Get get, final Integer lockid) throws IOException {
// Verify families are all valid
if (get.hasFamilies()) {
for (byte [] family: get.familySet()) {
checkFamily(family);
}
} else { // Adding all families to scanner
for (byte[] family: regionInfo.getTableDesc().getFamiliesKeys()) {
get.addFamily(family);
}
}
List
return new Result(result);
}
最终GET其实是转化为scan了
/*
* Do a get based on the get parameter.
*/
private List
Scan scan = new Scan(get);
List
InternalScanner scanner = null;
try {
scanner = getScanner(scan);
scanner.next(results);
} finally {
if (scanner != null)
scanner.close();
}
return results;
}