You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@hbase.apache.org by Royston Sellman <Ro...@cse.org.uk> on 2011/12/22 16:47:20 UTC

AggregateProtocol Example

Hi,

We are trying to use the aggregation functionality in HBase 0.92  and we have managed to get the test code working using the following command:

java -classpath junit-4.10.jar:build/*:$HBASELIBS/* org.junit.runner.JUnitCore org.apache.hadoop.hbase.coprocessor.TestAggregateProtocol

Closer inspection of this test class has revealed that it uses a mini DFS cluster to populate and run the tests. These tests return successfully.

However, when we attempt to run similar code on our development HDFS cluster we experience the following error:

[sshexec] 11/12/22 15:46:28 WARN client.HConnectionManager$HConnectionImplementation: Error executing for row
  [sshexec] java.util.concurrent.ExecutionException: org.apache.hadoop.hbase.ipc.HBaseRPC$UnknownProtocolException: org.apache.hadoop.hbase.ipc.HBaseRPC$UnknownProtocolException: No matching handler for protocol org.apache.hadoop.hbase.coprocessor.AggregateProtocol in region EDRPTestTbl,,1324485124322.7b9ee0d113db9b24ea9fdde90702d006.
  [sshexec]   at org.apache.hadoop.hbase.regionserver.HRegion.exec(HRegion.java:4010)
  [sshexec]   at org.apache.hadoop.hbase.regionserver.HRegionServer.execCoprocessor(HRegionServer.java:3040)
  [sshexec]   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  [sshexec]   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  [sshexec]   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  [sshexec]   at java.lang.reflect.Method.invoke(Method.java:597)
  [sshexec]   at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:364)
  [sshexec]   at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1325)
  [sshexec]
  [sshexec]   at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
  [sshexec]   at java.util.concurrent.FutureTask.get(FutureTask.java:83)
  [sshexec]   at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processExecs(HConnectionManager.java:1465)
  [sshexec]   at org.apache.hadoop.hbase.client.HTable.coprocessorExec(HTable.java:1555)
  [sshexec]   at org.apache.hadoop.hbase.client.coprocessor.AggregationClient.sum(AggregationClient.java:229)
  [sshexec]   at EDRPAggregator.testSumWithValidRange(EDRPAggregator.java:51)
  [sshexec]   at EDRPAggregator.main(EDRPAggregator.java:77)
  [sshexec]   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  [sshexec]   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  [sshexec]   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  [sshexec]   at java.lang.reflect.Method.invoke(Method.java:597)
  [sshexec]   at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
  [sshexec] Caused by: org.apache.hadoop.hbase.ipc.HBaseRPC$UnknownProtocolException: org.apache.hadoop.hbase.ipc.HBaseRPC$UnknownProtocolException: No matching handler for protocol org.apache.hadoop.hbase.coprocessor.AggregateProtocol in region EDRPTestTbl,,1324485124322.7b9ee0d113db9b24ea9fdde90702d006.
  [sshexec]   at org.apache.hadoop.hbase.regionserver.HRegion.exec(HRegion.java:4010)
  [sshexec]   at org.apache.hadoop.hbase.regionserver.HRegionServer.execCoprocessor(HRegionServer.java:3040)
  [sshexec]   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  [sshexec]   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  [sshexec]   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  [sshexec]   at java.lang.reflect.Method.invoke(Method.java:597)
  [sshexec]   at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:364)
  [sshexec]   at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1325)
  [sshexec]
  [sshexec]   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  [sshexec]   at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
  [sshexec]   at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
  [sshexec]   at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
  [sshexec]   at org.apache.hadoop.hbase.RemoteExceptionHandler.decodeRemoteException(RemoteExceptionHandler.java:96)
  [sshexec]   at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.translateException(HConnectionManager.java:1651)
  [sshexec]   at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1327)
  [sshexec]   at org.apache.hadoop.hbase.ipc.ExecRPCInvoker.invoke(ExecRPCInvoker.java:79)
  [sshexec]   at $Proxy3.getSum(Unknown Source)
  [sshexec]   at org.apache.hadoop.hbase.client.coprocessor.AggregationClient$4.call(AggregationClient.java:233)
  [sshexec]   at org.apache.hadoop.hbase.client.coprocessor.AggregationClient$4.call(AggregationClient.java:230)
  [sshexec]   at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$4.call(HConnectionManager.java:1453)
  [sshexec]   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
  [sshexec]   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
  [sshexec]   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
  [sshexec]   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
  [sshexec]   at java.lang.Thread.run(Thread.java:662)
  [sshexec] org.apache.hadoop.hbase.ipc.HBaseRPC$UnknownProtocolException: org.apache.hadoop.hbase.ipc.HBaseRPC$UnknownProtocolException: No matching handler for protocol org.apache.hadoop.hbase.coprocessor.AggregateProtocol in region EDRPTestTbl,,1324485124322.7b9ee0d113db9b24ea9fdde90702d006.
  [sshexec]   at org.apache.hadoop.hbase.regionserver.HRegion.exec(HRegion.java:4010)
  [sshexec]   at org.apache.hadoop.hbase.regionserver.HRegionServer.execCoprocessor(HRegionServer.java:3040)
  [sshexec]   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  [sshexec]   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  [sshexec]   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  [sshexec]   at java.lang.reflect.Method.invoke(Method.java:597)
  [sshexec]   at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:364)
  [sshexec]   at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1325)
  [sshexec]
  [sshexec]   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  [sshexec]   at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
  [sshexec]   at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
  [sshexec]   at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
  [sshexec]   at org.apache.hadoop.hbase.RemoteExceptionHandler.decodeRemoteException(RemoteExceptionHandler.java:96)
  [sshexec]   at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.translateException(HConnectionManager.java:1651)
  [sshexec]   at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1327)
  [sshexec]   at org.apache.hadoop.hbase.ipc.ExecRPCInvoker.invoke(ExecRPCInvoker.java:79)
  [sshexec]   at $Proxy3.getSum(Unknown Source)
  [sshexec]   at org.apache.hadoop.hbase.client.coprocessor.AggregationClient$4.call(AggregationClient.java:233)
  [sshexec]   at org.apache.hadoop.hbase.client.coprocessor.AggregationClient$4.call(AggregationClient.java:230)
  [sshexec]   at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$4.call(HConnectionManager.java:1453)
  [sshexec]   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
  [sshexec]   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
  [sshexec]   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
  [sshexec]   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
  [sshexec]   at java.lang.Thread.run(Thread.java:662)

The source for our class is:

import static org.junit.Assert.assertEquals;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.coprocessor.AggregationClient;
import org.apache.hadoop.hbase.client.coprocessor.LongColumnInterpreter;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.hbase.coprocessor.ColumnInterpreter;
import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;
import org.junit.Test;

public class EDRPAggregator {

       // private static final byte[] EDRP_FAMILY = Bytes.toBytes("EDRP");
       // private static final byte[] EDRP_QUALIFIER = Bytes.toBytes("advanceKWh");

       private static byte[] ROW = Bytes.toBytes("testRow");
       private static final int ROWSIZE = 20;
       private static byte[][] ROWS = makeN(ROW, ROWSIZE);
       private static final byte[] TEST_QUALIFIER = Bytes.toBytes("TestQualifier");
       private static final byte[] TEST_MULTI_CQ = Bytes.toBytes("TestMultiCQ");
       private static final int rowSeperator1 = 5;
         private static final int rowSeperator2 = 12;

       public static void testSumWithValidRange(Configuration conf,
                     String[] otherArgs) throws Throwable {
              byte[] EDRP_TABLE = Bytes.toBytes(otherArgs[1]);
              byte[] EDRP_FAMILY = Bytes.toBytes(otherArgs[2]);

              conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
                           "org.apache.hadoop.hbase.coprocessor.AggregateImplementation");

              // Utility.CreateHBaseTable(conf, otherArgs[1], otherArgs[2], true);

              HBaseTestingUtility util = new HBaseTestingUtility();
              HTable table = util.createTable(EDRP_TABLE, EDRP_FAMILY);

              AggregationClient aClient = new AggregationClient(conf);
              Scan scan = new Scan();
              scan.addColumn(EDRP_TABLE, EDRP_FAMILY);
              final ColumnInterpreter<Long, Long> ci = new LongColumnInterpreter();
              long sum = aClient.sum(Bytes.toBytes(otherArgs[0]), ci, scan);
              System.out.println(sum);
       }

       /**
       * Main entry point.
       *
        * @param argsThe
       *            command line parameters.
       * @throws Exception
       *             When running the job fails.
       */
       public static void main(String[] args) throws Exception {
              Configuration conf = HBaseConfiguration.create();

              String[] otherArgs = new GenericOptionsParser(conf, args)
                           .getRemainingArgs();
              if (otherArgs.length != 3) {
                     System.err
                                  .println("Wrong number of arguments: " + otherArgs.length);
                     System.err.println("Usage: " + "<tablename> <colfam> <qualifier>");
                     System.exit(-1);
              }

              try {
                     testSumWithValidRange(conf, otherArgs);
              } catch (Throwable e) {
                     e.printStackTrace();
              }
       }

       /**
       * an infrastructure method to prepare rows for the testtable.
       *
        * @param base
       * @param n
       * @return
       */
       private static byte[][] makeN(byte[] base, int n) {
              byte[][] ret = new byte[n][];
              for (int i = 0; i < n; i++) {
                     ret[i] = Bytes.add(base, Bytes.toBytes(i));
              }
              return ret;
       }
}

Please can you suggest what might be causing and/or how we might fix this UnknownProtocolException?

Also, does anyone have any working examples using the aggregation protocol other than the test code?

Thanks,
Royston