복붙노트

[HADOOP] HBase에서 SingleColumnValueFilter가있는 사용자 정의 비교기를 어떻게 사용합니까?

HADOOP

HBase에서 SingleColumnValueFilter가있는 사용자 정의 비교기를 어떻게 사용합니까?

두 개의 SingleColumnValueFilter 개체를 사용하여 HBase 테이블의 행을 필터링하여 열의 긴 값 범위 내에있는 모든 레코드를 다시 가져 오려고합니다. 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에 임대가 시간 초과되어 발생하지만이 예외는 throw되기 전에 발생합니다.

ResultScanner resultScanner = table.getScanner(scan);

ResultScanner를 반환하고 반복 할 수 있습니다.

누구나 가지고있는 예제 또는 SingleColumnValueFilter가 작동하는 사용자 지정 비교기를 사용하고 있거나 내가 뭘 잘못하고 있는지 알 수 있습니까?

해결법

  1. ==============================

    1.커스텀 콤퍼레이터를 가진 jar 파일은 쿼리하는 테이블이 $ HBASE_HOME / lib 폴더에있는 region 서버에 위치해야합니다. jar를 배치 한 후 클러스터를 다시 시작하면 쿼리가 작동합니다.

    커스텀 콤퍼레이터를 가진 jar 파일은 쿼리하는 테이블이 $ HBASE_HOME / lib 폴더에있는 region 서버에 위치해야합니다. jar를 배치 한 후 클러스터를 다시 시작하면 쿼리가 작동합니다.

  2. from https://stackoverflow.com/questions/3577142/how-do-you-use-a-custom-comparator-with-singlecolumnvaluefilter-on-hbase by cc-by-sa and MIT license