1. 程式人生 > >Hbase API高階特性-計數器

Hbase API高階特性-計數器

1.  許多收集統計資訊的應用有點選流或線上廣告意見,這些應用需要收集到日誌檔案用作後續的分析,使用者可以使用計數器做實時統計,從而放棄延時較高的批量處理操作。

2.  原子操作檢查並修改:將當前列當作計數器。

即把一個 column 當作 一個 counter,這樣便於給某些線上應用提供實時統計功能。(PS:比如帖子的實時瀏覽量:PV)

3.  如果沒有計數器特性:使用者需要對一行資料加鎖,然後讀取資料,再對當前資料做加法,最後寫回Hbase並釋放該行鎖。這樣會引起大量的資源競爭,有其是當客戶端程序崩潰之後,尚未釋放的鎖需要等待超時恢復,這會是一個高負載的系統中引起災難性的後果。

4.   計數器的增量可以是正數負數,正數代表加,負數代表減。

hbase(main):006:0> create'counters','daily','weekly','monthly'

0 row(s) in 2.2260 seconds

hbase(main):007:0> incr 'counters','201031003100','daily:hites',1

COUNTER VALUE = 1

hbase(main):008:0> incr'counters','201031003100','daily:hites',1

COUNTER VALUE = 2

hbase(main):009:0> get_counter  'counters','201031003100','daily:hites'

COUNTER VALUE = 2

5.  計數器就是一個與其他列類似的簡單的列。

6.  單計數器:

    public void oneCounter(long num) throws IOException{
long cnt1 = table.incrementColumnValue(Bytes.toBytes("3100"), 
Bytes.toBytes("info"), Bytes.toBytes("name"), num);
}

7.  多計數器:

public void moreCounter() throws IOException{
Increment increment1 = new Increment(Bytes.toBytes("3100"));

increment1.addColumn(Bytes.toBytes("info"), Bytes.toBytes("clicks"), 20);
increment1.addColumn(Bytes.toBytes("info"), Bytes.toBytes("hits"), 1);
increment1.addColumn(Bytes.toBytes("class"), Bytes.toBytes("clicks"), 10);
increment1.addColumn(Bytes.toBytes("class"), Bytes.toBytes("hits"), 10);

Result result1 = table.increment(increment1);
for(KeyValue kv:result1.raw()){
System.out.println("KV1: "+kv +"value: "+Bytes.toLong(kv.getValue()));
}

/*Increment increment2 = new Increment(Bytes.toBytes("3102"));
increment1.addColumn(Bytes.toBytes("info"), Bytes.toBytes("clicks"), 5);
increment1.addColumn(Bytes.toBytes("info"), Bytes.toBytes("hits"), 1);
increment1.addColumn(Bytes.toBytes("class"), Bytes.toBytes("clicks"), 0);
increment1.addColumn(Bytes.toBytes("class"), Bytes.toBytes("hits"), -5);
Result result2 = table.increment(increment2);
for(KeyValue kv:result2.raw()){
System.out.println("KV2: "+kv +"value: "+Bytes.toLong(kv.getValue()));
}*/
}