【问题标题】:How do you use a custom comparator with SingleColumnValueFilter on HBase?如何在 HBase 上将自定义比较器与 SingleColumnValueFilter 一起使用?
【发布时间】:2010-08-27 01:39:20
【问题描述】:

我正在尝试使用两个 SingleColumnValueFilter 对象从 HBase 表中过滤行,以带回该列的 long 值范围内的所有记录。根据 SingleColumnValueFilter 的文档,除非您将自己的比较器传递给它,否则它会对列值进行字典比较。该 api 显示 SingleColumnValueFilter 采用 WritableByteArrayComparable 作为实现此目的的一种方式。

我写了一个扩展 WritableByteArrayComparable 的类并覆盖了 compare 方法。

    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;
    }
}

我正在使用以下方法设置过滤器:

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)

在网络上查看此执行的原因的共识是访问 resultScanner.next() 的代码花费太长时间导致对 regionServer 的租约超时,但此异常之前被抛出

ResultScanner resultScanner = table.getScanner(scan);

返回一个我可以遍历的 ResultScanner。

有没有人知道或知道将自定义比较器与 SingleColumnValueFilter 一起使用的示例,或者知道我做错了什么?

【问题讨论】:

    标签: java hadoop hbase


    【解决方案1】:

    似乎需要将带有自定义比较器的 jar 放在您要查询的表位于 $HBASE_HOME/lib 文件夹中的区域服务器上。放置 jar 后重新启动集群,查询应该可以工作了。

    【讨论】:

    • 是的,可能把它放在类路径上就足够了,但我也遇到了一些问题。
    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2019-03-22
    • 2012-03-07
    • 1970-01-01
    相关资源
    最近更新 更多