2010-08-26 84 views
1

我正在尝试使用两个SingleColumnValueFilter对象来过滤来自HBase表的行,以使所有属于该列的long值范围内的记录恢复。根据SingleColumnValueFilter的文档,除非您传递自己的比较器,否则它会对列值进行词典对比。 api显示SingleColumnValueFilter以WritableByteArrayComparable作为实现此目的的一种方式。如何在HBase上使用SingleColumnValueFilter的自定义比较器?

我写了一个类扩展了WritableByteArrayComparable并覆盖了比较方法。

public class LongWritableComparable extends WritableByteArrayComparable { 

    public LongWritableComparable() { 
     super(); 
    } 

    public LongWritableComparable(byte[] value) { 
     super(value); 
    } 

    public LongWritableComparable(Long value) { 
     super(Bytes.toBytes(value)); 
    } 

    @Override 
    public int compareTo(byte[] otherValue) { 
     byte[] thisValue = this.getValue(); 
     long thisLong = Bytes.toLong(thisValue); 
     long otherLong = Bytes.toLong(otherValue); 

     if (thisLong == otherLong) { 
      return 0; 
     } 
     if (thisLong < otherLong) { 
      return -1; 
     } 
     return 1; 
    } 
} 

我settting了使用过滤器:

SingleColumnValueFilter lowerBoundAddressResourceFilter = new SingleColumnValueFilter(
        graphTable.getResource().getName(), 
        Bytes.toBytes(HBaseProperties.getInstance().getQualifierIpAdressLongRepresentation()), 
        CompareFilter.CompareOp.GREATER_OR_EQUAL, 
        new LongWritableComparable(lowerRangeValue)); 

,但我看到了以下异常:

2010-08-25 14:24:10,034 ERROR org.apache.hadoop.hbase.regionserver.HRegionServer: 
org.apache.hadoop.hbase.UnknownScannerException: Name: -1 
     at org.apache.hadoop.hbase.regionserver.HRegionServer.next(HRegionServer.java:1880) 
     at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:657) 
     at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:915) 
2010-08-25 14:24:10,052 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 0 on 60020, call next(-1, 1000) from 172.16.32.215:53206: error: org.apache.hadoop.hbase.UnknownScannerException: Name: -1 
org.apache.hadoop.hbase.UnknownScannerException: Name: -1 
     at org.apache.hadoop.hbase.regionserver.HRegionServer.next(HRegionServer.java:1880) 
     at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:657) 
     at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:915) 

网上寻找这个execption事业的共识是:访问resultScanner.next()的代码耗时太长,导致regionServer的租约超时,但是此异常在

之前被抛出
ResultScanner resultScanner = table.getScanner(scan); 

与回报,我可以遍历一个ResultScanner。

没有任何人有或者知道使用与SingleColumnValueFilter自定义比较的作品或任何见识到了什么,我做错了的例子吗?

回答

2

看来,需要放在区域服务器(S)与您的自定义比较罐子你在哪里查询驻留在表中$ HBASE_HOME/lib文件夹。放置该jar后重新启动你的集群,查询应该可以工作。

+0

是的,它可能足以将它放在classpath上,但我也遇到了一些问题。 – wlk 2010-08-26 19:50:59