Filter 协处理器中的hbase内部扫描和过滤器

Filter 协处理器中的hbase内部扫描和过滤器,filter,hbase,database-scan,Filter,Hbase,Database Scan,全部: 最近,我在Hbase0.94.17中编写了一个协处理器,它是一个扩展BaseEndpointCoprocessor的类,一个用于计算一个表的行数的rowcount方法 我有个问题 如果我没有在扫描中设置过滤器,我的代码对两个表都可以正常工作。一个表有1000000行,另一个表有160000000行。数那张大桌子花了大约2分钟 然而,若我在扫描中设置了一个过滤器,它只在小表上工作。它将在更大的表上抛出一个异常。 org.apache.hadoop.hbase.ipc.ExecRPCInvo

全部:

最近,我在Hbase0.94.17中编写了一个协处理器,它是一个扩展BaseEndpointCoprocessor的类,一个用于计算一个表的行数的rowcount方法

我有个问题

如果我没有在扫描中设置过滤器,我的代码对两个表都可以正常工作。一个表有1000000行,另一个表有160000000行。数那张大桌子花了大约2分钟

然而,若我在扫描中设置了一个过滤器,它只在小表上工作。它将在更大的表上抛出一个异常。 org.apache.hadoop.hbase.ipc.ExecRPCInvoker$1@2c88652b,java.io.IOException:java.io.IOException:java.lang.IndexOutOfBoundsException:Index:0,Size:0

相信我,我会反复检查我的代码

所以,要用filter计算我的表,我必须编写以下愚蠢的代码,首先,我没有在scan中设置filter,然后,在我得到一行记录后,我编写了一个方法来过滤它

它在两张桌子上都起作用

但我不知道为什么

我试图阅读HRegion.java中的scanner源代码,但是,我没有得到它

所以,如果你知道答案,请帮助我。多谢各位

@凌驾 公共长rowcountconf配置引发IOException{ //TODO自动生成的方法存根 扫描=新扫描; parseConfigurationconf; Filter=null; 如果this.mFilterString!=null&!mFilterString.equals{ ParseFilter parse=新的ParseFilter; filter=parse.parseFilterString过滤字符串; //scan.setFilterfilter; } scan.setCachingthis.mscanching; InternalScanner scanner=RegionProcessorEnvironment getEnvironment.getRegion.getScannerscan; 长和=0; 试一试{ 列表曲线=新的ArrayList; 布尔hasMore=false; 做{ 曲线清晰; hasMore=scanner.nextcurVals; 如果筛选器!=null{ 过滤器。复位; 如果HbaseUtil.filterOneResultcurVals为,则筛选{ 持续 } } sum++; }而哈斯莫尔; }最后{ scanner.close; } 回报金额; } 以下是我的hbase util代码:

公共静态布尔筛选器结果列表kvList,筛选器筛选器{ 如果kvList.size==0 返回true; KeyValue kv=kvList.get0; 如果filter.filterRowKeykv.getBuffer,kv.getRowOffset,kv.getRowLength{ 返回true; } 对于KeyValue kv2:kvList{ 如果filter.filterKeyValuekv2==filter.ReturnCode.NEXT\u行{ 返回true; } } filter.filterRowkvList; 如果filter.filterRow 返回true; 其他的 返回false; }
好吧,那是我的错。在我使用jdb调试代码之后,我得到了以下异常:

org.apache.hadoop.ipc.RemoteException:java.io.IOException:java.lang.IndexOutOfBoundsException:Index:0,Size:0 位于java.util.ArrayList.rangeCheckArrayList.java:635 位于java.util.ArrayList.getArrayList.java:411 很明显,我的结果列表是空的

hasMore=scanner.nextcurVals; 这意味着,如果我在扫描中使用过滤器,这个曲线列表可能是空的,但hasMore是真的

但是我想,如果一条记录被过滤,它应该跳转到下一行,并且这个列表永远不应该是空的。我错了

我的客户端没有在我的控制台上打印任何远程错误消息,它只是捕获这个远程异常,然后重试。
重试10次后,它会打印另一个异常,这是没有意义的。

并且我的筛选器是SingleColumnVaueFilter。很短。SingleColumnValueFilter'F','s',=,'binary:0',true,true