hbase-1.2.1之协处理器的源码学习详解编程语言

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操作为例:

hbase-1.2.1之协处理器的源码学习详解编程语言

下面为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

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/industrynews/13738.html

(0)
上一篇 2021年7月19日 16:10
下一篇 2021年7月19日 16:10

相关推荐

发表回复

登录后才能评论