1. Enable AggregationClient coprocessor
You have two choices :
You can enable aggregation coprocessor on all your tables by adding the following lines tohbase-site.xml :
<property> <name>hbase.coprocessor.user.region.classes</name> <value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value> </property>or ...you can enable coprocessor only on a table throught the HBase shell :
1. disable the table
hbase> disable 'mytable'
2. add the coprocessor
hbase> alter 'mytable', METHOD => 'table_att','coprocessor'=>'|org.apache.hadoop.hbase.coprocessor.AggregateImplementation||'
3. re-enable the table
hbase> enable 'mytable'
2. Increase RPC timeout (opt)
In some cases the following exception could be raised :
java.net.SocketTimeoutException: Call to node2/55.37.68.154:60020 failed on socket timeout exception
On large table or if you are expecting slow I/O this might be necessary:
<property> <name>hbase.rpc.timeout</name> <value>300000</value> </property>n.b. : you can also specify this property directly in the client source code, see next section
3. ''RowCount' Snippet
- public class MyAggregationClient {
- private static final byte[] TABLE_NAME = Bytes.toBytes("mytable");
- private static final byte[] CF = Bytes.toBytes("d");
- public static void main(String[] args) throws Throwable {
- Configuration customConf = new Configuration();
- customConf.setStrings("hbase.zookeeper.quorum",
- "node0,node1,node2");
- // Increase RPC timeout, in case of a slow computation
- customConf.setLong("hbase.rpc.timeout", 600000);
- // Default is 1, set to a higher value for faster scanner.next(..)
- customConf.setLong("hbase.client.scanner.caching", 1000);
- Configuration configuration = HBaseConfiguration.create(customConf);
- AggregationClient aggregationClient = new AggregationClient(
- configuration);
- Scan scan = new Scan();
- scan.addFamily(CF);
- long rowCount = aggregationClient.rowCount(TABLE_NAME, null, scan);
- System.out.println("row count is " + rowCount);
- }
- }