用hbase(0.92版本以上)的协处理器实现快速返回查询结果总数

refer to :http://blog.csdn.net/liuxingjiaofu/article/details/8501344

在0.92版本的hbase上添加了协处理器的功能,协处理器分为两大部分 endpoint和observer.

observer相当于一个钩子的作用,根据钩子运行的模块来划分,又分成三个

RegionObserver:用这个做数据操纵事件,其紧密的绑定到表的region

MasterObserver:处理集群级别的事件:管理操作和数据定义语言操作

WALObserver:预写日志处理

而endpoint可看作关系数据库中的存储过程,用户可自定义。

言归正传,如何配置并使用协处理器呢

本次只介绍用endpoint实现快速返回符合条件结果总数的方法。

1.配置

在$HBASE_HOME/conf/hbase-site.xml添加一个配置项。我用的0.94版本自带的实现为AggregateImplementation,具体如下

 
   hbase.coprocessor.region.classes
   org.apache.hadoop.hbase.coprocessor.AggregateImplementation    
 

若之前未配置此项,则配置完后,需要重启hbase方能生效。

2.客户端使用,直接上代码。

scan直接用查询结果所用的scan即可。

[java]  view plain copy
  1. /** 
  2.  * 获得符合条件结果总数 
  3.  * @author wanglongyf2 2013-1-11 上午10:29:15 
  4.  * @param scan 
  5.  * @return 
  6.  */  
  7. private long getTotalNumber(Scan scan) {  
  8.     AggregationClient aggregationClient = new AggregationClient(conf);  
  9.     long rowCount = 0;  
  10.     try {  
  11.         "color:#ff0000;">scan.addColumn(columnFamily, etimeQualifier);//必须有此句,或者用addFamily(),否则出错,异常包含 ci ****  
  12. an>         rowCount = aggregationClient.rowCount(tableName, null, scan);  
  13.     } catch (Throwable e) {  
  14.      LOG.fatal("getTotalNumber wrong. ");  
  15.      e.printStackTrace();  
  16.     }  
  17.     return rowCount;  
  18. }  


若要验证此结果总数和实际的结果数是否相同,则看下面,关键代码

[java]  view plain copy
  1. scan.setStartRow(startRow);  
  2. scan.setStopRow(stopRow);  
  3. Filter filter = new SingleColumnValueFilter(columnFamily, qualifier,  
  4.                                             CompareOp.GREATER, Bytes.toBytes(startTime));  
  5. scan.setFilter(filter);  
  6. long number = getTotalNumber(scan);  
  7. ResultScanner scanner = table.getScanner(scan);  
  8. Result res = scanner.next();   
  9. while(res != null) {  
  10.     numberOfResults ++;  
  11.     res = scanner.next();  
  12. }  
  13. if (numberOfResults != number) {  
  14.     LOG.fatal(String.format("use aggregation %d and scanner %d gets inconsistant result. ",  
  15.                             number, numberOfResults));  
  16. }  

你可能感兴趣的:(hbase)