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()));
}*/
}