我正在尝试使用两个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自定义比较的作品或任何见识到了什么,我做错了的例子吗?
是的,它可能足以将它放在classpath上,但我也遇到了一些问题。 – wlk 2010-08-26 19:50:59