HBaseClient源码分析Word文件下载.docx
- 文档编号:15882629
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:10
- 大小:50.16KB
HBaseClient源码分析Word文件下载.docx
《HBaseClient源码分析Word文件下载.docx》由会员分享,可在线阅读,更多相关《HBaseClient源码分析Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
getHRegionConnection:
根据特定的地址建立一个到regionserver的连接。
通过HBaseRPC类得到一个proxy实例HRegionInterface。
HRegionInterface是在RegionServer端实现的。
其中有get,put,delete,scan,rowlock等操作。
locateRegion:
查找某张表内某行的region信息。
getMaster:
获得一个到masterserver的连接,通过代理类HBaseRPC得到一个HMasterInterface实例。
Client调用该接口和Master通信。
getZooKeeperWrapper:
获得该连接可以使用的一个ZooKeeperWrapper,进而或许ROOT,META表信息,session信息等。
1.2Htable
Htable主要提供表内的操作,put,delete,get,scan等操作
scannerTimeout:
scan的超时时间,如果超过这个时间没有返回则抛出异常
configuration:
配置文件对象
ArrayList<
Put>
writeBuffer:
调用put()方法时,会先加到这个writerBuffer里,同时增加统计writerBuffer的大小,大小超出writeBufferSize,或者设置了autoFlush标志,那么马上提交put操作。
writeBufferSize在配置文件中设置。
autoFlush:
自动提交标记,如果没有设置会缓存部分put。
scannerCaching:
设置一次扫描多少条记录,在配置文件中设置。
在scan操作时会用来实例化clientscanner的caching值,当然也可以通过Scan对象来设置。
maxScannerResultSize:
这个值用于设置scan的时候最大能扫描多长的记录,如果超出这个长度,那么需要终止此次扫描,下次扫描再继续。
put/delete/get:
增删查询
classClientScanner:
这个内部类主要用于Scan操作,稍后详细分解
1.3HBaseAdmin
和表的上线下线相关的操作,创建,删除表。
对表或者是column进行增删改。
查询集群工作状态。
HConnectionconnection:
一个HConnection引用,用tableserver实例化。
HMasterInterfacemaster:
和master通信的接口,最终通过RPC机制获得一个代理对象来实例化
createTable/deleteTable/modifyTable
createColumn/deleteColumn/modifyColumn
spilt:
切分表
compact:
合并表
getClusterStatus:
查询群集状态
2
主要API内部实现
2.1Add/Delete
批量的添加或删除操作内部实现机制基本相同,最后调用RegionServer的接口不同。
当提交一个批处理Add/Delete请求的时候,这一批数据可能分布在不同的RegionServer上,所以这里主要的操作就是找到相应的regionserver,调用server上的接口操作数据。
下面以删除数据为例说明一下这一过程:
(1)
客户端接口
Delete>
d=newArrayList<
();
Deleted1=newDelete(“row1″.getBytes());
Deleted2=newDelete(“row2″.getBytes());
d.add(d1);
d.add(d2);
……
table.delete(d);
(2)
客户端处理
客户端接受到delete请求以后调用HConnection的接口:
publicintprocessBatchOfDeletes(finalArrayList<
list,finalbyte[]tableName)
该接口在HConnectionManager类的内部类TableServers中有具体实现。
processBatchOfDeletes
创建一个Batch()类匿名对象,实现其中的doCall(),等待回调
Proces()
遍历list中所有数据,重复下面所有调用。
定位数据所属的region,对于一个region下面的数据调用doCall()方法
doCall()
创建一个ServerCallable的匿名对象,实现call()方法,做为参数调用getRegionServerWithRetries()
getRegionServerWithRetries()
连接region,获取一个PRC的代理对象实例化HRegionserverInterface
对象server回调call()
Call()
Server.delete()
通过RPC的代理对象透明的调用delete()操作
Delete操作的主要流程概括为:
定位待发送的list中的数据所属的region,连接该regionserver并返回一个代理类对象,通过该对象执行delete操作。
client的函数调用栈如表所示Add和Delete的主要区别就于Call()方法的实现不同,一个调用server的add,一个调用delete。
其余的过程完全相同。
在上面的调用栈里有两个关键的过程
(1)如何根据rowkey定位region?
参照blog
(2)list里的数据属于不同的region,相同的region进行一次doCall()调用,这一过程是如何实现的?
这个过程在process里实现:
process(){
currentRegion=第一条记录的region;
for(i=0;
i<
list.length;
i++){
添加list[i]到currentlist;
if(currentregion!
=list[i+1]的region){
回调docall();
//对currentlist的数据调用server端接口,delete
currentregion=
list[i+1]的region
}
}
2.2scan
2.2.1客户端接口
Scans=newScan();
s.setMaxVersions();
ResultScannerss=table.getScanner(s);
for(Resultr:
ss){
System.out.println(newString(r.getRow()));
for(KeyValuekv:
r.raw()){
System.out.println(newString(kv.getValue()));
2.2.2客户端主要函数
Scan操作涉及两个非常重要的类ClientScanner和ScanCallable,前者实现了迭代器Iterator,实现了迭代扫描方法。
后者和其他的Callable一样需要实现一个call()函数用于和server交互时,回调。
这里的call()有三种状态实现和server不同的交互。
(1)ClientScanner
Scanscan:
scan对象,可以设置要扫描的起止rowkey,filter等等属性。
booleanclosed:
HRegionInfocurrentRegion:
记录当前region,因为扫描过程可能跨region
ScannerCallablecallable:
LinkedList<
Result>
cache:
缓存扫描结果
intcaching:
设置一次扫描多少条
nextScanner():
根据扫描的startkey确定开始扫描的位置,初始化和next()迭代扫描的时候都要调用这个判断下究竟从哪里开始扫描了,然后通过调用函数:
getRegionServerWithRetries(callable),回调callable里边的call函数去服务器端openScanner(),为读取数据做准备。
注意:
如果是next()调用该函数时候,首先第一步要关闭上次打开的scanner().
next():
真正读取数据的地方。
首先会判断缓存cache里有没有,如果有就不用去服务器去了。
如果没有,只要动用服务器端了,依然是这个接口getRegionServerWithRetries(callable),callable的回调函数call()会调用server端的next()来取得数据,这个call()和上面那个不一样吗?
为什么实现不一样的功能,稍后分解。
(2)ScanCallable
scannerId:
记录服务器段scanner的打开状态。
Closed:
是否要关闭scanner
Call():
后续分解。
2.2.3Scan执行过程
一次scan操作的主要过程可描述为:
根据起始rowkey先确定要扫描的数据的位置,然后openscanner(),开始读取,读取预设数量的Result[]出来存在缓冲区里,然后记住最后一次读取的rowkey,下次执行next()操作时,先关闭上次打开的scanner,然后根据最后记录的rowkey再次去确定要扫描数据的位置,openscanner()...如此循环之道读出所有需要的数据。
当然这期间可能要重新定位regionserver,在一个regionserver上读到关于该表的最后一条记录时,记住这个rowkey然后返回,下一轮读还是会从这个rowkey开始去寻找新的regionserver,然后openscanner(),继续循环。
要扫描的数据可能分布在不同的regionserver上,所以扫描操作的过程可描述为:
初始化,调用nextScanner()判断起始数据的region
next(),读取数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HBaseClient 源码 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)