HBase-1.2.1之Get操作源码学习

最近在学习HBase的源码,主要是学习HRegionServer部分。从Get请求入手,找到了主要的实现类:Get,HTable,ConnectionManager等。具体如下:

Get操作:使用Java API读取数据:


1、  实例化Configuration类

Configuration conf = HbaseConfiguration.create();

在Hbase-common项目中的org.apache.hadoop.hbase.HBaseConfiguration类中。在第90行为无参的create方法。在该方法中,通过addHbaseResources(conf)将hbase-default.xml和hbase-site.xml文件加载到Configuration中。

2、  实例化HTable类

HTable hTable = new HTable(conf,tableName);

HTable类在hbase-cllient项目下的org.apache.hadoop.hbase.client.HTable类中。该类实现了HTableInterface接口和RegionLoactor接口。

第153行为上述构造函数,所做操作有:

1)        根据配置文件获得连接:

this.connection = ConnectionManager.getConnectionInternal(conf);233行

2)        在finishSetup中根据连接和表名实例化了regionLocator。244行

3、  实例化获得类

Get get = new Get(toBytes(“row1”));

Get类在hbase-client项目下的org.apache.hadoop.hbase.client.Get类中。该类实现了Row、Comparable<Row>接口,继承了Query类。

第90行为上述构造函数,所做操作有:检查了参数rowkey的合法性。之后赋值this.row=row;92行。

4、  读取数据

get.addFamily(personal);

get.addColumn(personal,name);

5、  获取结果

Result result = table.get(g);

源码在HTable类中的804行。

在第821行,实例化了RegionServerCallable实例,参数中用到了connection、tablename和rowkey,在重写的call方法中,

a)        创建getRequest

b)        创建rpc连接

832行的ClientProtos.GetREsponseresponse = getStub().get(controller,request)中,就是把request发给server端,然后由server端返回response。所以这里是client端和serverrpc通信连接处。调用到的server端的代码为server项目下的RSRpcServices中的get方法(第1999行),返回结果为GetResponse

定位Region的代码是在server端的RSRpcServices中的get中的函数中找到。

c)        得到GetResponse

d)        返回Result

 返回的Result为ArrayList<Cell>,

Cell接口在hbase-common项目中的org.apache.hadoop.hbase.Cell接口中。该接口定义的属性有:row、columnfamily、column qualifier、timestamp、type、MVCC version、value。

在HRegion类中有属性成员private  RegionCoprocessorHost coprocessorHost;(590行)

在RegionCoprocessorHost类中的第859行的postGet方法中的call方法中用到了RegionObserver oserver,RegionObserver接口的实现类有BaseRegionObserveràSimpleRegionObserve继承了BaseRegionObserver类。

6、  从Result实例读值

Byte[] value = result.getValue(Bytes.toBytes(“personal”),Bytes.toBytes(“name”));

在源码中查看Result类中的getValue方法,看到如下:

public byte[] getValue(byte [] family, byte [] qualifier) {
  Cell kv = getColumnLatestCell(family, qualifier);
  if (kv == null) {
    return null;
  }
  return CellUtil.cloneValue(kv);
}

由此可见,在从result中读取数据时,也是先得到Cell,然后从Cell中获取数据。

*********************************************************************************************************************************************************************************

Get操作中在第5步中的Result result = table.get(g);中,需要client与server端连接,具体如下:


最后一步中,为Hbase中配置Ranger的情形。如果协处理器选用的不是Ranger而是其他,则同样会调用其他的协处理器类。

猜你喜欢

转载自blog.csdn.net/mm_bit/article/details/51537718
今日推荐