Как вы используете собственный компаратор с SingleColumnValueFilter на HBase? - PullRequest
1 голос
/ 26 августа 2010

Я пытаюсь отфильтровать строки из таблицы HBase, используя два объекта SingleColumnValueFilter , чтобы вернуть все записи, попадающие в диапазон длинных значений для столбца.Согласно документации для SingleColumnValueFilter, он выполняет лексикографическое сравнение значения столбца, если вы не передадите ему свой собственный компаратор.API показывает SingleColumnValueFilter, принимающий WritableByteArrayComparable в качестве способа достижения этой цели.

Я написал класс, расширяющий 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;
    }
}

IЯ настраиваю фильтр, используя:

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 () занимает слишком много времени, что приводит к превышению времени ожидания аренды для сервера региона, но это исключение возникает до того, как

ResultScanner resultScanner = table.getScanner(scan);

вернется с ResultScanner, через который я могу выполнить итерацию.

Кто-нибудь знает или знает пример использования пользовательского компаратора с SingleColumnValueFilter, который работает, или любое понимание того, что я делаю неправильно?

1 Ответ

2 голосов
/ 26 августа 2010

Похоже, что банку с вашим пользовательским компаратором нужно поместить на сервер (ы) региона, где запрашиваемая таблица находится в папке $ HBASE_HOME / lib.После размещения банки перезагрузите кластер, и запрос должен работать.

...