欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

HBase源码分析之GET操作之get转化为scan

程序员文章站 2022-05-13 17:58:31
...

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 set = familyMap.get(family);
if(set == null) {
set = new TreeSet(Bytes.BYTES_COMPARATOR);
}
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(connection, tableName, get.getRow()) {
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 result = get(get);


return new Result(result);
}


最终GET其实是转化为scan了

/*
* Do a get based on the get parameter.
*/
private List get(final Get get) throws IOException {
Scan scan = new Scan(get);


List results = new ArrayList();


InternalScanner scanner = null;
try {
scanner = getScanner(scan);
scanner.next(results);
} finally {
if (scanner != null)
scanner.close();
}
return results;
}

HBase源码分析之GET操作之get转化为scan