最近在学习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端和server端rpc通信连接处。调用到的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而是其他,则同样会调用其他的协处理器类。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/9525.html