将计算推送到 RegionServer,减少服务器和客户的的数据通信开销,提高 HBase 的计算性能
协处理器框架主要分为两大类,即 Observer 和 Endpoint
Observer 和 RDMBS 的触发器很类似,在一些特定的事件发生时被执行。这些事件包括用户产生的事件,也包括服务器内部产生的事件。
Endpoint 和 RDMBS 的存储过程很类似,用户提供一些自定义代码,并在 HBase 服务器端执行,结果通过 RPC 返回给客户。比较常见的场景包括聚合操作(求和、计数等)。
1、判断协处理器设置是否生效
hbase(main):001:0> desc 'test:DW_F_XDR_HTTP_FGCSVSH_USR_H'
2、卸载协处理器
hbase(main):002:0> disable 'test:DW_F_XDR_HTTP_FGCSVSH_USR_H'
hbase(main):003:0> alter 'test:DW_F_XDR_HTTP_FGCSVSH_USR_H',METHOD=>'table_att_unset',NAME=>'coprocessor$1'
hbase(main):004:0> enable 'test:DW_F_XDR_HTTP_FGCSVSH_USR_H'
3、通过 HBase Shell 部署
hbase(main):005:0> alter 'test:DW_F_XDR_HTTP_FGCSVSH_USR_H',METHOD=>'table_att','coprocessor'=>'/tmp/coprocessor/un-offlinedata-0.0.1-SNAPSHOT093001.jar|com.bdpp.hbase.coprocessor.server.MultiGroupByCoprocessorEndPoint||'
坑一:在打 jar 包时,强烈建议只打自己的 calss 文件进 jar 包
坑二:之前使用过同名jar包创建协处理器,代码升级(修改、添加了协处理器类名)后,一定要修改jar包名称
2019-09-30 16:33:02,691 WARN [org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel] - Call failed on IOException
org.apache.hadoop.hbase.exceptions.UnknownProtocolException: org.apache.hadoop.hbase.exceptions.UnknownProtocolException: No registered coprocessor service found for name multiGroupByService in region test:DW_F_XDR_HTTP_FGCSVSH_USR_H,,1566311115729.da659da17288ae8745c90171ee780cee.
at org.apache.hadoop.hbase.regionserver.HRegion.execService(HRegion.java:7907)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.execServiceOnRegion(RSRpcServices.java:1969)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.execService(RSRpcServices.java:1951)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:33652)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2191)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:183)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:163)
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.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:332)
at org.apache.hadoop.hbase.protobuf.ProtobufUtil.execService(ProtobufUtil.java:1637)
at org.apache.hadoop.hbase.ipc.RegionCoprocessorRpcChannel$1.call(RegionCoprocessorRpcChannel.java:104)
at org.apache.hadoop.hbase.ipc.RegionCoprocessorRpcChannel$1.call(RegionCoprocessorRpcChannel.java:94)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:136)
at org.apache.hadoop.hbase.ipc.RegionCoprocessorRpcChannel.callExecService(RegionCoprocessorRpcChannel.java:107)
at org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel.callMethod(CoprocessorRpcChannel.java:56)
at com.bdpp.hbase.coprocessor.server.MultiGroupByCoprocessor$multiGroupByService$Stub.getMultiGroupBy(MultiGroupByCoprocessor.java:3678)
at com.bdpp.hbase.coprocessor.client.MultiGroupByClient$2.call(MultiGroupByClient.java:316)
at com.bdpp.hbase.coprocessor.client.MultiGroupByClient$2.call(MultiGroupByClient.java:303)
at org.apache.hadoop.hbase.client.HTable$15.call(HTable.java:1800)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
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 name multiGroupByService in region test:DW_F_XDR_HTTP_FGCSVSH_USR_H,,1566311115729.da659da17288ae8745c90171ee780cee.
at org.apache.hadoop.hbase.regionserver.HRegion.execService(HRegion.java:7907)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.execServiceOnRegion(RSRpcServices.java:1969)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.execService(RSRpcServices.java:1951)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:33652)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2191)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:183)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:163)
at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1269)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:227)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:336)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.execService(ClientProtos.java:34118)
at org.apache.hadoop.hbase.protobuf.ProtobufUtil.execService(ProtobufUtil.java:1633)
... 13 more
2019-09-30 16:33:02,692 WARN [org.apache.hadoop.hbase.client.HTable] - Error calling coprocessor service com.bdpp.hbase.coprocessor.server.MultiGroupByCoprocessor$multiGroupByService for row 000000006511012019092602
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at org.apache.hadoop.hbase.client.HTable.coprocessorService(HTable.java:1812)
at com.bdpp.hbase.coprocessor.client.MultiGroupByClient.execFastEndpointCoprocessor(MultiGroupByClient.java:300)
at com.bdpp.dataonline.server.handler.task.QuerySubscriberAppFlowTask.dataTransmit(QuerySubscriberAppFlowTask.java:146)
at com.bdpp.dataonline.server.handler.task.QuerySubscriberAppFlowTask.doPost(QuerySubscriberAppFlowTask.java:71)
at com.test.netty.task.ServiceGateTask.runTask(ServiceGateTask.java:150)
at com.test.netty.task.AbstractHTTPTask.onEvent(AbstractHTTPTask.java:141)
at com.test.netty.task.AbstractHTTPTask.onEvent(AbstractHTTPTask.java:1)
at com.lmax.disruptor.WorkProcessor.run(WorkProcessor.java:139)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at com.bdpp.hbase.coprocessor.client.MultiGroupByClient$1.update(MultiGroupByClient.java:261)
at com.bdpp.hbase.coprocessor.client.MultiGroupByClient$1.update(MultiGroupByClient.java:257)
at org.apache.hadoop.hbase.client.HTable$15.call(HTable.java:1803)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
... 1 more
java.lang.NullPointerException
at com.bdpp.hbase.coprocessor.client.MultiGroupByClient$1.update(MultiGroupByClient.java:261)
at com.bdpp.hbase.coprocessor.client.MultiGroupByClient$1.update(MultiGroupByClient.java:257)
at org.apache.hadoop.hbase.client.HTable$15.call(HTable.java:1803)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
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)