HBase 2.4 RegionCoprocessor 抛出 UnknownProtocolException

问题描述 投票:0回答:1

我开发了一个端点协处理器,它在 HBase 1.4 中运行良好,但是当我使用 HBase 2.4 的代码时,它出现了

UnknownProtocolException
。 在 regionserver 日志中,我收到 hbase 已加载协处理器的消息:

INFO (CoprocessorHost.java:174) 03-02 00:36:31,178 System coprocessor query.coprocessor.STQueryEndPoint loaded, priority=536870911.  

但是当我使用这个协处理器时,它会抛出

UnknownProtocolException

日志:

WARN (SyncCoprocessorRpcChannel.java:49) 03-02 00:36:40,442 Call failed on IOException  
org.apache.hadoop.hbase.exceptions.UnknownProtocolException: org.apache.hadoop.hbase.exceptions.UnknownProtocolException: No registered coprocessor service found for QueryService in region xz2_intersect_query_test2-XZ2-default,\x00\x00\x00\x01,1677687709620.6a01edca77b0c9df5e13304aa2920357.
    at org.apache.hadoop.hbase.regionserver.HRegion.execService(HRegion.java:8568)
    at org.apache.hadoop.hbase.regionserver.RSRpcServices.execServiceOnRegion(RSRpcServices.java:2498)
    at org.apache.hadoop.hbase.regionserver.RSRpcServices.execService(RSRpcServices.java:2472)
    at org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:45035)
    at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:387)
    at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:132)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:369)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:349)

    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:423)
    at org.apache.hadoop.hbase.ipc.RemoteWithExtrasException.instantiateException(RemoteWithExtrasException.java:97)
    at org.apache.hadoop.hbase.ipc.RemoteWithExtrasException.unwrapRemoteException(RemoteWithExtrasException.java:87)
    at org.apache.hadoop.hbase.protobuf.ProtobufUtil.makeIOExceptionOfException(ProtobufUtil.java:276)
    at org.apache.hadoop.hbase.protobuf.ProtobufUtil.handleRemoteException(ProtobufUtil.java:261)
    at org.apache.hadoop.hbase.client.RegionServerCallable.call(RegionServerCallable.java:126)
    at org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithRetries(RpcRetryingCallerImpl.java:104)
    at org.apache.hadoop.hbase.client.RegionCoprocessorRpcChannel.callExecService(RegionCoprocessorRpcChannel.java:88)
    at org.apache.hadoop.hbase.client.SyncCoprocessorRpcChannel.callMethod(SyncCoprocessorRpcChannel.java:47)
    at cn.edu.whu.trajspark.query.coprocessor.autogenerated.QueryCondition$QueryService$Stub.query(QueryCondition.java:5682)
    at cn.edu.whu.trajspark.query.coprocessor.STCoprocessorQuery$1.call(STCoprocessorQuery.java:36)
    at cn.edu.whu.trajspark.query.coprocessor.STCoprocessorQuery$1.call(STCoprocessorQuery.java:31)
    at org.apache.hadoop.hbase.client.HTable$11.call(HTable.java:1003)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.hadoop.hbase.ipc.RemoteWithExtrasException(org.apache.hadoop.hbase.exceptions.UnknownProtocolException): org.apache.hadoop.hbase.exceptions.UnknownProtocolException: No registered coprocessor service found for QueryService in region xz2_intersect_query_test2-XZ2-default,\x00\x00\x00\x01,1677687709620.6a01edca77b0c9df5e13304aa2920357.
    at org.apache.hadoop.hbase.regionserver.HRegion.execService(HRegion.java:8568)
    at org.apache.hadoop.hbase.regionserver.RSRpcServices.execServiceOnRegion(RSRpcServices.java:2498)
    at org.apache.hadoop.hbase.regionserver.RSRpcServices.execService(RSRpcServices.java:2472)
    at org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:45035)
    at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:387)
    at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:132)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:369)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:349)

    at org.apache.hadoop.hbase.ipc.AbstractRpcClient.onCallFinished(AbstractRpcClient.java:381)
    at org.apache.hadoop.hbase.ipc.AbstractRpcClient.access$100(AbstractRpcClient.java:88)
    at org.apache.hadoop.hbase.ipc.AbstractRpcClient$3.run(AbstractRpcClient.java:415)
    at org.apache.hadoop.hbase.ipc.AbstractRpcClient$3.run(AbstractRpcClient.java:411)
    at org.apache.hadoop.hbase.ipc.Call.callComplete(Call.java:115)
    at org.apache.hadoop.hbase.ipc.Call.setException(Call.java:130)
    at org.apache.hadoop.hbase.ipc.NettyRpcDuplexHandler.readResponse(NettyRpcDuplexHandler.java:162)
    at org.apache.hadoop.hbase.ipc.NettyRpcDuplexHandler.channelRead(NettyRpcDuplexHandler.java:192)
    ...

我用它作为

try {
      coprocessorResult = indexTable.getTable().coprocessorService(QueryCondition.QueryService.class,
          ranges.get(0).getStart().toByteArray(), ranges.get(ranges.size() - 1).getEnd().toByteArray(),
          new Batch.Call<QueryCondition.QueryService, List<QueryCondition.TrajectoryResult>>() {
            @Override
            public List<QueryCondition.TrajectoryResult> call(QueryCondition.QueryService queryService) throws IOException {
              // BlockingRpcCallback<QueryCondition.QueryResponse> rpcCallback = new BlockingRpcCallback();
              CoprocessorRpcUtils.BlockingRpcCallback rpcCallback = new CoprocessorRpcUtils.BlockingRpcCallback<QueryCondition.QueryResponse>();
              queryService.query(new ServerRpcController(), request, (RpcCallback) rpcCallback);
              QueryCondition.QueryResponse response = (QueryCondition.QueryResponse) rpcCallback.get();
              return response.getListList();
            }
          });
    } catch (Throwable e) {
      e.printStackTrace();
    }

hbase-site.xml

<property>
    <name>hbase.coprocessor.region.classes</name>
    <value>
      query.coprocessor.STQueryEndPoint
    </value>
  </property>

我的端点代码的一部分:

public class STQueryEndPoint extends QueryCondition.QueryService 
implements RegionCoprocessor, CoprocessorService {

}

我试过:

  • 重新打包协处理器jar,放入hbase类路径
  • 重启hbase。
  • 确保我实施了
    RegionCoprocessor

提前感谢您的帮助!

java hadoop hbase
1个回答
0
投票

我在遵循 GitHub 中的协处理器示例后修复了这个问题。其原因是从 Coprocessor 接口覆盖了

getService()

之前:

@Override
public Iterable<Service> getServices() {
  return RegionCoprocessor.super.getServices();
}

之后:

@Override
public Iterable<Service> getServices() {
  return Collections.singleton(this);
}
© www.soinside.com 2019 - 2024. All rights reserved.