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,
Tom