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

WBOY
发布: 2016-06-07 17:25:04
原创
966 人浏览过

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;
  }

linux

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!