hbase-1.2.1之协处理器的源码学习
2016-07-28 15:56
381 查看
HBase中的协处理器:两种:observer和endpoint
Observer:
RegionServerObserver:钩子函数主要是针对对region的管理的,比如merge,writeWAL,createRElplicationEndPoint,replicateLogEntries.
RegionObserver:钩子函数主要是针对client端对region上的数据操作,比如get,put,delete,batchMutate等。
MasterObserver:钩子函数主要是针对对HMaster操作。比如CreateTable,DeleteTable,ModifyTable,AddColumn等。
上述的协处理器主要是在对应的CoprocessorHost中被调用。比如RegionObserver在RegionCoprocessorHost中被调用(调用方式:比如在RegionCoprocessorHost中的441行,在pre钩子函数中,通过调用call方法(call方法的参数oserver))。往回推,在HRegion中有成员变量RegionCoprocessorHost,HRegion中调用钩子函数处:例如第6743行的get 方法(在6737行List<Cell> results = get(get,true),其中的第二个参数true表示要调用协处理器。)。
在RSRpcServices.java中的第1999行的get方法中,在2029行用到了region.get(clientGet),这样在之后便调用到了HRegion中的get方法,进而通过传入true参数调用协处理器。
即:HTable中的get方法
—》RegionServerCallable
—》RSRpcServices
—》HRegion
—》HRegionCoprocessorHost
—》RegionObserver(Ranger中的RangerAuthorizationCoprocessor实现了RegionObserver接口)。
下面的流程图是以get操作为例:
下面为java中使用协处理器的示例:
long singleRegionCount(String tableName, String rowkey,boolean reCount)
{
long rowcount = 0;
try{
Configuration config = new Configuration();
HConnection conn = HConnectionManager.createConnection(config);
HTableInterface tbl = conn.getTable(tableName);
//获取 Channel
CoprocessorRpcChannel channel = tbl.coprocessorService(rowkey.getBytes());
org.ibm.developerworks.getRowCount.ibmDeveloperWorksService.BlockingInterface service =
org.ibm.developerworks.getRowCount.ibmDeveloperWorksService.newBlockingStub(channel);
//设置 RPC 入口参数
org.ibm.developerworks.getRowCount.getRowCountRequest.Builder request =
org.ibm.developerworks.getRowCount.getRowCountRequest.newBuilder();
request.setReCount(reCount);
//调用 RPC
org.ibm.developerworks.getRowCount.getRowCountResponse ret =
service.getRowCount(null, request.build());
//解析结果
rowcount = ret.getRowCount();
}
catch(Exception e) {e.printStackTrace();}
return rowcount;
}
或者采用如下方式:
Configuration conf = HBaseConfiguration.create();
Config.set(“hbase.zookeeper.property.clientPort”,”2181”);
Config.set(“habse.zookeeper.quorum”,”10.2.41.215”);
Config.set(“hbase.master”,”10.2.41.207:600000);
HTable table = new HTable(conf, table_name);
Map<byte[], ByteString> re = table.coprocessorService(HellodWord.class,null,null,new Batch.call<HelloWorld, ByteString> (){
@Override
Public ByteString call(HelloWorld instance ) throws IOException{
….
}
关于协处理器的学习,请参考:
www.ibm.com/developerworks/cn/opensource/os-cn-hbase-coprocessor1/index.html
www.ibm.com/developerworks/cn/opensource/os-cn-hbase-coprocessor2/index.html
Observer:
RegionServerObserver:钩子函数主要是针对对region的管理的,比如merge,writeWAL,createRElplicationEndPoint,replicateLogEntries.
RegionObserver:钩子函数主要是针对client端对region上的数据操作,比如get,put,delete,batchMutate等。
MasterObserver:钩子函数主要是针对对HMaster操作。比如CreateTable,DeleteTable,ModifyTable,AddColumn等。
上述的协处理器主要是在对应的CoprocessorHost中被调用。比如RegionObserver在RegionCoprocessorHost中被调用(调用方式:比如在RegionCoprocessorHost中的441行,在pre钩子函数中,通过调用call方法(call方法的参数oserver))。往回推,在HRegion中有成员变量RegionCoprocessorHost,HRegion中调用钩子函数处:例如第6743行的get 方法(在6737行List<Cell> results = get(get,true),其中的第二个参数true表示要调用协处理器。)。
在RSRpcServices.java中的第1999行的get方法中,在2029行用到了region.get(clientGet),这样在之后便调用到了HRegion中的get方法,进而通过传入true参数调用协处理器。
即:HTable中的get方法
—》RegionServerCallable
—》RSRpcServices
—》HRegion
—》HRegionCoprocessorHost
—》RegionObserver(Ranger中的RangerAuthorizationCoprocessor实现了RegionObserver接口)。
下面的流程图是以get操作为例:
下面为java中使用协处理器的示例:
long singleRegionCount(String tableName, String rowkey,boolean reCount)
{
long rowcount = 0;
try{
Configuration config = new Configuration();
HConnection conn = HConnectionManager.createConnection(config);
HTableInterface tbl = conn.getTable(tableName);
//获取 Channel
CoprocessorRpcChannel channel = tbl.coprocessorService(rowkey.getBytes());
org.ibm.developerworks.getRowCount.ibmDeveloperWorksService.BlockingInterface service =
org.ibm.developerworks.getRowCount.ibmDeveloperWorksService.newBlockingStub(channel);
//设置 RPC 入口参数
org.ibm.developerworks.getRowCount.getRowCountRequest.Builder request =
org.ibm.developerworks.getRowCount.getRowCountRequest.newBuilder();
request.setReCount(reCount);
//调用 RPC
org.ibm.developerworks.getRowCount.getRowCountResponse ret =
service.getRowCount(null, request.build());
//解析结果
rowcount = ret.getRowCount();
}
catch(Exception e) {e.printStackTrace();}
return rowcount;
}
或者采用如下方式:
Configuration conf = HBaseConfiguration.create();
Config.set(“hbase.zookeeper.property.clientPort”,”2181”);
Config.set(“habse.zookeeper.quorum”,”10.2.41.215”);
Config.set(“hbase.master”,”10.2.41.207:600000);
HTable table = new HTable(conf, table_name);
Map<byte[], ByteString> re = table.coprocessorService(HellodWord.class,null,null,new Batch.call<HelloWorld, ByteString> (){
@Override
Public ByteString call(HelloWorld instance ) throws IOException{
….
}
关于协处理器的学习,请参考:
www.ibm.com/developerworks/cn/opensource/os-cn-hbase-coprocessor1/index.html
www.ibm.com/developerworks/cn/opensource/os-cn-hbase-coprocessor2/index.html
相关文章推荐
- 水平触发(LT)和边沿触发(ET)
- 《创业维艰如何完成比难更难的事》摘要
- 如何在一个项目中是OC和Swift开发
- 【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率
- CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
- 鼠标滚轮事件
- 仿豆瓣分类标签的实现
- RHEL7下如何直接运行jar可执行文件
- Gson解析嵌套json
- Java基础概要总结
- Ubuntu 开发环境搭建
- 属性动画,逐帧动画,补间动画基本用法笔记
- 利用httpclient 模拟登录,获取登录后信息数据
- 海思3531芯片资料汇总
- 改善既有代码的设计(二)----------重构和性能
- 网络连接的判断
- 自我介绍
- ipconfig
- SpecMPI2007 benchmark
- Performing stop of activity that is not resumed