当我运行我的hbase自定义过滤器时出现此错误:
org.apache.hadoop.hbase.client.RpcRetryingCaller@459c8c0a,java.io.IOException:java.io.IOException:java.lang.reflect.InvocationTargetException 在org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1360) 在org.apache.hadoop.hbase.protobuf.ProtobufUtil.toScan(ProtobufUtil.java:916) 在org.apache.hadoop.hbase.regionserver.HRegionServer.scan(HRegionServer.java:3056) at org.apache.hadoop.hbase.protobuf.generated.ClientProtos $ ClientService $ 2.callBlockingMethod(ClientProtos.java:28454) 在org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2008) 在org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:92) 在org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.consumerLoop(SimpleRpcScheduler.java:160) 在org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.access $ 000(SimpleRpcScheduler.java:38) 在org.apache.hadoop.hbase.ipc.SimpleRpcScheduler $ 1.run(SimpleRpcScheduler.java:110) 在java.lang.Thread.run(Thread.java:744) 引起:java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) 在org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1358) ......还有9个 引起:org.apache.hadoop.hbase.exceptions.DeserializationException:java.io.IOException:java.lang.reflect.InvocationTargetException at org.apache.hadoop.hbase.filter.FilterList.parseFrom(FilterList.java:406) ......还有14个 引起:java.io.IOException:java.lang.reflect.InvocationTargetException 在org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1360) 在org.apache.hadoop.hbase.filter.FilterList.parseFrom(FilterList.java:403) ......还有14个 引起:java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) 在org.apache.hadoop.hbase.protobuf.ProtobufUtil.toFilter(ProtobufUtil.java:1358) ......还有15个 引起:org.apache.hadoop.hbase.exceptions.DeserializationException:parseFrom在基过滤器上调用,但应在派生类型上调用 在org.apache.hadoop.hbase.filter.Filter.parseFrom(Filter.java:267) ......还有20个
有人知道我该怎么办?
答案 0 :(得分:6)
尝试制作自定义过滤器时也出现此错误。我的问题是我没有在我的过滤器中包含函数“toByteArray”和“parseFrom”。有关我找到解决方案的位置,请参阅here,并链接到示例。 (花了我两个星期的时间挖掘 - HBase真的可以使用一些更好的文档...)
至于需要采用这些方法的内容,我在这方面仍然遇到麻烦。从概念上讲(据我所知),它们的目的是将过滤器实例的识别信息(基本上,您将发送给构造函数的信息)编码和解码为序列化的字节串。这样,特定的过滤器可以在任何需要的地方“实例化”。
对我来说,包括这些方法可以防止挂起和错误,我的程序现在可以完成。我不认为我完全理解这些方法,因为看起来过滤器仍然没有实际运行,但这是另一个主题。 (如果你弄清楚了,let me know!)
答案 1 :(得分:0)
我有1个群集服务器出现了同样的错误。注意toByteArray和parseFrom已经存在的地方,并且相同的jar文件在其他集群上也可以正常工作。通过重新启动HBase和Zookeeper服务,并确保/ hbase / lib文件夹和自定义过滤jar文件首先具有适当的所有者(将其设置为hbase用户),可以解决该问题。
我无法复制该错误,但是上面的操作为我解决了该错误。我试过更改所有者,即/ hbase / lib文件夹的HBase配置,创建了一个新文件夹,但无法复制它,因此可以归结为HBase重新启动。
丢失的链接现在位于here