用hbase(0.92版本以上)的协处理器实现快速返回查询结果总数
2014-10-28 10:06
405 查看
在0.92版本的hbase上添加了协处理器的功能,协处理器分为两大部分 endpoint和observer.
observer相当于一个钩子的作用,根据钩子运行的模块来划分,又分成三个
而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 {
<span style="color:#ff0000;">scan.addColumn(columnFamily, etimeQualifier);//必须有此句,或者用addFamily(),否则出错,异常包含 ci ****
</span> 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));
}
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 {
<span style="color:#ff0000;">scan.addColumn(columnFamily, etimeQualifier);//必须有此句,或者用addFamily(),否则出错,异常包含 ci ****
</span> 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));
}
相关文章推荐
- 用hbase(0.92版本以上)的协处理器实现快速返回查询结果总数
- 用hbase(0.92版本以上)的协处理器实现快速返回查询结果总数
- 用hbase(0.92版本以上)的协处理器实现快速返回查询结果总数 .
- mysql查询中实现oracle中的rownum函数的效果,返回每行查询结果的行序号
- Elasticsearch+hbase 实现hbase中数据的快速查询(二)
- Python Sqlite3以字典形式返回查询结果的实现方法
- Elasticsearch+hbase 实现hbase中数据的快速查询(三)
- hibernate实现多表查询处理返回多个对象结果
- ORACLE实现存储过程返回查询结果集合的方法
- Hbase获得查询结果总数
- MYSQL JDBC快速查询响应的方法,快速返回机制的实现
- 费劲心思完成了+ 点击查询之后实现页面不可操作,等待查询,几秒后返回结果页面
- 为什么Hbase能实现快速的查询
- MySQL中数据结果集分页功能的实现方法;数据库查询返回特定结果即分页查询
- Elasticsearch+hbase 实现hbase中数据的快速查询(一)
- 三种方法实现从“一个(组)查询过程中返回两个表的查询结果”
- OGRE 1.7以上版本实现鼠标查询(非CEGUI)
- Elasticsearch对Hbase中的数据建索引实现海量数据快速查询
- 三种方法实现从“一个(组)查询过程中返回两个表的查询结果”
- JPA使用本地查询实现联表查询,同一结果集中返回多个实体,多个字段