HBase java自定义过滤器错误DeserializationException ClassNotFoundException

时间:2016-04-21 14:00:39

标签: java filter hbase

我扩展了FilterBase以创建自定义过滤器MyCustomFilter。我编译它,将.jar上传到运行HBase的服务器,重新启动它,当我将这个类添加到过滤器时(我只有这个过滤器)

ArrayList<String> testList = new ArrayList<String>();
List<Filter> filters = new ArrayList<Filter>();

Scan scan = new Scan();
scan.setMaxVersions(1);
scan.setCaching(10);

public static final byte[] FamilyName = Bytes.toBytes("D");

Filter filter1 = new MyCustomFilter(FamilyName);
filters.add(filter1);

FilterList filterList  = new FilterList(
          FilterList.Operator.MUST_PASS_ALL, filters);      

scan.setFilter(filterList);

ResultScanner scanner = testTable.getScanner(scan);

try{
    Result res = null;
    int count = 0;

    while ((res = scanner.next()) != null){
            testList.add(new String(res.getRow()));
    }
}
finally{
    scanner.close();
}

执行代码时出现错误:

org.apache.hadoop.hbase.DoNotRetryIOException: org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.reflect.InvocationTargetException
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1467)
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toScan(ProtobufUtil.java:994)
        at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:2237)
        at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:32205)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2114)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:101)
        at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:130)
        at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:107)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1463)
        ... 8 more
Caused by: org.apache.hadoop.hbase.exceptions.DeserializationException: org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.ClassNotFoundException: filters.MyCustomFilter
        at org.apache.hadoop.hbase.filter.MyCustomFilter.parseFrom(MyCustomFilter.java:396)
        ... 13 more
Caused by: org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.ClassNotFoundException: filters.MyCustomFilter
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1467)
        at org.apache.hadoop.hbase.filter.FilterList.parseFrom(FilterList.java:393)
        ... 13 more
Caused by: java.lang.ClassNotFoundException: filters.MyCustomFilter
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at org.apache.hadoop.hbase.util.DynamicClassLoader.loadClass(DynamicClassLoader.java:147)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1457)
        ... 14 more
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
        at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:106)
        at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:95)
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRemoteException(ProtobufUtil.java:325)
        at org.apache.hadoop.hbase.client.ScannerCallable.openScanner(ScannerCallable.java:380)
        at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:199)
        at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:62)
        at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200)
        at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:346)
        at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:320)
        at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:126)
        at org.apache.hadoop.hbase.client.ResultBoundedCompletionService$QueueingFuture.run(ResultBoundedCompletionService.java:64)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.hadoop.hbase.ipc.RemoteWithExtrasException(org.apache.hadoop.hbase.DoNotRetryIOException): org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.reflect.InvocationTargetException
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1467)
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toScan(ProtobufUtil.java:994)
        at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:2237)
        at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:32205)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2114)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:101)
        at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:130)
        at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:107)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1463)
        ... 8 more
Caused by: org.apache.hadoop.hbase.exceptions.DeserializationException: org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.ClassNotFoundException: filters.MyCustomFilter
        at org.apache.hadoop.hbase.filter.FilterList.parseFrom(FilterList.java:396)
        ... 13 more
Caused by: org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.ClassNotFoundException: filters.MyCustomFilter
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1467)
        at org.apache.hadoop.hbase.filter.FilterList.parseFrom(FilterList.java:393)
        ... 13 more
Caused by: java.lang.ClassNotFoundException: filters.MyCustomFilter
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at org.apache.hadoop.hbase.util.DynamicClassLoader.loadClass(DynamicClassLoader.java:147)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1457)
        ... 14 more
        at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1226)
        at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:213)
        at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:287)
        at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.scan(ClientProtos.java:32651)
        at org.apache.hadoop.hbase.client.ScannerCallable.openScanner(ScannerCallable.java:372)
        ... 10 more

自定义过滤器代码是

package filters;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.exceptions.DeserializationException;
import org.apache.hadoop.hbase.filter.FilterBase;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.log4j.Logger;

public class MyCustomFilter extends FilterBase {
    protected byte[] familyNameComparator = null;
    protected boolean filterRow = true;

    public MyCustomFilter(final byte[] familyName) throws Exception {
        this.familyNameComparator = familyName;
    }

    @Override
    public ReturnCode filterKeyValue(Cell cell) {
        if (Bytes.compareTo(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(), familyNameComparator,
                0, familyNameComparator.length) != 0) {
            return ReturnCode.SKIP;
        } else {
            return ReturnCode.INCLUDE;
        }
    }

    public boolean filterRow() {
        return this.filterRow;
    }

    public boolean filterRowKey(Cell cell) throws IOException {
        return false;
    }

    @Override
    public void reset() {
        this.filterRow = true;
    }

    /**
     * @return The filter serialized
     */
    public byte[] toByteArray() {
        return this.familyNameComparator;
    }

}

我修改了hbase-env.sh

# Extra Java CLASSPATH elements.  Optional. 
# export HBASE_CLASSPATH=
export HBASE_CLASSPATH="/mnt/datadisk/customfilters/customfilter.jar" 

有什么建议吗?

最诚挚的问候!

0 个答案:

没有答案