• 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
     **/
    

      

      

  • 相关阅读:
    【arc068E】Snuke Line
    Subseq
    【agc004F】Namori
    Yura
    【agc008F】Black Radius
    【arc080F】Prime Flip
    【arc075F】Mirrored
    【arc074E】RGB Sequence
    【bzoj3669】魔法森林
    【bzoj2500】幸福的道路
  • 原文地址:https://www.cnblogs.com/similarface/p/5834347.html
Copyright © 2020-2023  润新知