《HBase權威指南》讀書筆記3
來源:程序員人生 發布時間:2016-02-28 11:52:57 閱讀次數:2741次
第3章 客戶端API:基礎知識
-
所有修改都保證了行級別的原子性: 要末讀到最新的修改,要末等待系統允許寫入轉業修改
-
用戶要盡可能使用批處理(batch)更新來減少單獨操作同1行數據的次數
-
寫操作中設計的列的數目其實不會影響該行數據的原子性,行原子性會同時保護到所有列
-
創建HTable實例(指的是在java中新建該類),每一個實例都要掃描.META. 表,以檢查該表是不是存在,推薦用戶只創建1次HTable實例,而且是每一個線程創建1個
-
如果用戶需要多個HTable實例,建議使用HTablePool類(類似連接池)
CRUD
-
還可以通過 KeyValue 來添加Put: Put add(KeyValue kv)
-
getFamilyMap() 可以遍歷Put實例中每個可用的KeyValue實例
-
用 has(family, qualifier) 來檢查是不是存在特定的單元格,而不需要遍歷全部集合
-
Put.getRow() 可以獲得rowkey
-
Put.heapSize() 可以計算當前Put實例所需的堆大小,既包括其中的數據,也包括內部數據結構所需的空間
KeyValue
KeyValue提供了1些比較器(可能
可以進行服務器端排序?),列出可能用到的幾種:
-
KeyComparator 比較 getKey()
-
KVComparator
-
RowComparator 比較 getRow()
客戶真個寫緩沖區
-
客戶端有1個寫緩沖區(默許大小2M),搜集1堆put,然后1次發給服務器
-
通過 table.setAutoFlush(false) 來激活緩沖區(只有在寫非常頻繁的情況下會用到)
-
hbase-site.xml 中的 hbase.client.write.buffer來調劑大小
以下情況會激起緩沖區的刷寫
-
激活寫緩沖區以后要手動調用 flushCommits()
-
緩沖區滿了的時候也會自動調用flushCommits()方法
-
table.close()也會觸發刷寫
注意:如果只存儲大單元格,緩沖區的作用就不大,由于大部份時間是傳輸時間而不是開關socket的時間
Put列表
可以傳入1個列表的 Put
void Put(Listputs)
不過如果同時插入多個put,當其中某個出錯的時候,前面幾個會被正常插入,往后的put就都不會插入
GET
-
get.exist(Get get) 方法,在需要檢查1個比較大的列的時候能節省網絡傳輸
-
Result getRowBefore 可以獲得某個行之前的行
批量處理操作
-
put,get, delete 列表其實都是通過 batch() 方法實現的
-
直接使用batch(Listactions, Object[] results, ... ) 可以同時傳入3種實例中的任意1種
-
batch其實不使用寫緩沖區
注意:不可以把對同1行的put和delete放在1個批量處理里面,由于批量處理的順序不可控
兩種批量查詢的區分
用batch(Listactions, Object[] results)批量查 和 Object[] batch(Listactions) 的區分是
-
batch(Listactions, Object[] results)可以返回部份結果
-
Object[] batch(Listactions) 1旦出錯,1條都沒有
行鎖
盡可能不要使用行鎖,如果必須使用,請1定節儉占用鎖的時間
掃描
-
通過 hbase-site.xml 中的 hbase.regionserver.lease.period 設定 ResultScanner 的租約
-
由于每次next()都要發1次要求,所以掃描器也有緩存,叫scanner caching ,默許是關閉的
-
通過 setBatch(5) 可以每次 next() 返回5列,注意是 列!
各種特性
HRegionLocation getRegionLocation(row)
Map getRegionInfo()
這些方法可以獲得某1行數據的具體位置,或所在的region信息
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈