HBase之计数器
HBase计数器 #创建counters表 列族['daily','weekly','monthly'] hbase(main):001:0> create 'counters','daily','weekly','monthly' 0 row(s) in 1.5670 seconds => Hbase::Table - counters #递增命中 步长默认为1 hbase(main):002:0> incr 'counters', '20150101', 'daily:hits', 1 COUNTER VALUE = 1 0 row(s) in 0.3320 seconds hbase(main):003:0> incr 'counters', '20150101', 'daily:hits', 1 COUNTER VALUE = 2 0 row(s) in 0.0140 seconds #获取计数器 hbase(main):004:0> get_counter 'counters', '20150101', 'daily:hits' COUNTER VALUE = 2 #使用了put去修改计数器 会导致后面的错误 原因是'1'会转换成Bytes.toBytes() hbase(main):020:0> put 'counters' ,'20150102','daily:hits','1' 0 row(s) in 0.0520 seconds hbase(main):021:0> incr 'counters', '20150102', 'daily:hits', 1 ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it's 1 bytes wide at org.apache.hadoop.hbase.regionserver.HRegion.getLongValue(HRegion.java:7647) at org.apache.hadoop.hbase.regionserver.HRegion.applyIncrementsToColumnFamily(HRegion.java:7601) at org.apache.hadoop.hbase.regionserver.HRegion.doIncrement(HRegion.java:7480) at org.apache.hadoop.hbase.regionserver.HRegion.increment(HRegion.java:7440) at org.apache.hadoop.hbase.regionserver.RSRpcServices.increment(RSRpcServices.java:551) at org.apache.hadoop.hbase.regionserver.RSRpcServices.mutate(RSRpcServices.java:2227) at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:33646) at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2178) at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112) at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:133) at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:108) at java.lang.Thread.run(Thread.java:745) hbase(main):001:0> get 'counters','20150102' COLUMN CELL daily:hits timestamp=1472808748361, value=1 1 row(s) in 0.3190 seconds hbase(main):002:0> put 'counters' ,'20150102','daily:hits','1' 0 row(s) in 0.0640 seconds hbase(main):003:0> get 'counters','20150102' COLUMN CELL daily:hits timestamp=1472808858593, value=1 1 row(s) in 0.0090 seconds #计数步长20 hbase(main):004:0> incr 'counters', '20150101', 'daily:hits', 20 COUNTER VALUE = 22 0 row(s) in 0.0260 seconds hbase(main):005:0> incr 'counters', '20150101', 'daily:hits', 20 COUNTER VALUE = 42 0 row(s) in 0.0090 seconds #默认步长是1 hbase(main):009:0> hbase(main):010:0* incr 'counters', '20150101', 'daily:hits' COUNTER VALUE = 45 0 row(s) in 0.0100 seconds #计数器可以-1 hbase(main):011:0> incr 'counters', '20150101', 'daily:hits', -1 COUNTER VALUE = 44 0 row(s) in 0.0110 seconds hbase(main):012:0> incr 'counters', '20150101', 'daily:hits', -1 #计数也可为0 hbase(main):013:0> incr 'counters', '20150101', 'daily:hits', 0 COUNTER VALUE = 43 0 row(s) in 0.0080 seconds
JAVA操作:
单计数器:
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.filter.*; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; /** * 单计数器 * similarface * similarface@outlook.com */ public class SingleCounter { public static void main(String args[]) throws IOException{ Configuration configuration = HBaseConfiguration.create(); Connection connection = ConnectionFactory.createConnection(configuration); Table table = connection.getTable(TableName.valueOf("counters")); //incrementColumnValue(行号,列族,列,步长) long cnt1=table.incrementColumnValue(Bytes.toBytes("20150105"),Bytes.toBytes("daily"),Bytes.toBytes("hits"),1L); System.out.println(cnt1); long cnt2=table.incrementColumnValue(Bytes.toBytes("20150105"),Bytes.toBytes("daily"),Bytes.toBytes("hits"),1); System.out.println(cnt2); long current=table.incrementColumnValue(Bytes.toBytes("20150105"),Bytes.toBytes("daily"),Bytes.toBytes("hits"),0); System.out.println(current); long cnt3=table.incrementColumnValue(Bytes.toBytes("20150105"),Bytes.toBytes("daily"),Bytes.toBytes("hits"),-1); System.out.println(cnt3); table.close(); connection.close(); } } /** 1 2 2 1 **/
复合计数器:
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; /** * 复合计数器 * similarface * similarface@outlook.com */ public class MultipleCounter { public static void main(String args[]) throws IOException{ Configuration configuration = HBaseConfiguration.create(); Connection connection = ConnectionFactory.createConnection(configuration); Table table = connection.getTable(TableName.valueOf("counters")); Increment increment1 = new Increment(Bytes.toBytes("20160101")); increment1.addColumn(Bytes.toBytes("daily"),Bytes.toBytes("clicks"),1); increment1.addColumn(Bytes.toBytes("daily"),Bytes.toBytes("hits"),1); increment1.addColumn(Bytes.toBytes("weekly"),Bytes.toBytes("clicks"),10); increment1.addColumn(Bytes.toBytes("weekly"),Bytes.toBytes("hits"),10); Result result = table.increment(increment1); for(Cell cell:result.rawCells()){ System.out.println("Cell: " + cell + " Value: " + Bytes.toLong(cell.getValueArray(), cell.getValueOffset(),cell.getValueLength())); } Increment increment2 = new Increment(Bytes.toBytes("20160101")); increment2.addColumn(Bytes.toBytes("daily"),Bytes.toBytes("clicks"), 5); increment2.addColumn(Bytes.toBytes("daily"),Bytes.toBytes("hits"), 1); increment2.addColumn(Bytes.toBytes("weekly"),Bytes.toBytes("clicks"), 0); increment2.addColumn(Bytes.toBytes("weekly"),Bytes.toBytes("hits"), -5); Result result2 = table.increment(increment2); for (Cell cell : result2.rawCells()) { System.out.println("Cell: " + cell + " Value: " + Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength())); } table.close(); connection.close(); } } /** Cell: 20160101/daily:clicks/1473057324875/Put/vlen=8/seqid=0 Value: 1 Cell: 20160101/daily:hits/1473057324875/Put/vlen=8/seqid=0 Value: 1 Cell: 20160101/weekly:clicks/1473057324875/Put/vlen=8/seqid=0 Value: 10 Cell: 20160101/weekly:hits/1473057324875/Put/vlen=8/seqid=0 Value: 10 Cell: 20160101/daily:clicks/1473057324886/Put/vlen=8/seqid=0 Value: 6 Cell: 20160101/daily:hits/1473057324886/Put/vlen=8/seqid=0 Value: 2 Cell: 20160101/weekly:clicks/1473057324886/Put/vlen=8/seqid=0 Value: 10 Cell: 20160101/weekly:hits/1473057324886/Put/vlen=8/seqid=0 Value: 5 **/