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

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

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

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

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

WALObserver:预写日志处理

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

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

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

1.配置

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

 <property>
   <name>hbase.coprocessor.region.classes</name>
   <value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>    
 </property>

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

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

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

    /**
     * 获得符合条件结果总数
     * @author wanglongyf2 2013-1-11 上午10:29:15
     * @param scan
     * @return
     */
    private long getTotalNumber(Scan scan) {
    	AggregationClient aggregationClient = new AggregationClient(conf);
    	long rowCount = 0;
    	try {
    		scan.addColumn(columnFamily, etimeQualifier);//必须有此句,或者用addFamily(),否则出错,异常包含 ci ****
	        rowCount = aggregationClient.rowCount(tableName, null, scan);
        } catch (Throwable e) {
	        LOG.fatal("getTotalNumber wrong. ");
	        e.printStackTrace();
        }
    	return rowCount;
    }


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

		        scan.setStartRow(startRow);
		        scan.setStopRow(stopRow);
		        Filter filter = new SingleColumnValueFilter(columnFamily, qualifier,
		                                                    CompareOp.GREATER, Bytes.toBytes(startTime));
		        scan.setFilter(filter);
		        long number = getTotalNumber(scan);
		        ResultScanner scanner = table.getScanner(scan);
		        Result res = scanner.next(); 
		        while(res != null) {
		        	numberOfResults ++;
		        	res = scanner.next();
		        }
		        if (numberOfResults != number) {
		        	LOG.fatal(String.format("use aggregation %d and scanner %d gets inconsistant result. ",
		        	                        number, numberOfResults));
		        }


 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值