《HBase权威指南》读书笔记3
生活随笔
收集整理的這篇文章主要介紹了
《HBase权威指南》读书笔记3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第3章 客戶端API:基礎知識
- 所有修改都保證了行級別的原子性: 要么讀到最新的修改,要么等待系統允許寫入改行修改
- 用戶要盡量使用批處理(batch)更新來減少單獨操作同一行數據的次數
- 寫操作中設計的列的數目并不會影響該行數據的原子性,行原子性會同時保護到所有列
- 創建HTable實例(指的是在java中新建該類),每個實例都要掃描.META. 表,以檢查該表是否存在,推薦用戶只創建一次HTable實例,而且是每個線程創建一個
- 如果用戶需要多個HTable實例,建議使用HTablePool類(類似連接池)
CRUD
- 還可以通過 KeyValue 來添加Put: Put add(KeyValue kv)
- getFamilyMap() 可以遍歷Put實例中每一個可用的KeyValue實例
- 用 has(family, qualifier) 來檢查是否存在特定的單元格,而不需要遍歷整個集合
- Put.getRow() 可以獲取rowkey
- Put.heapSize() 可以計算當前Put實例所需的堆大小,既包含其中的數據,也包含內部數據結構所需的空間
KeyValue
KeyValue提供了一些比較器(可能可以進行服務器端排序?),列出可能用到的幾種:- KeyComparator ? 比較 getKey()
- KVComparator ?
- RowComparator ? 比較 getRow()
客戶端的寫緩沖區
- 客戶端有一個寫緩沖區(默認大小2M),收集一堆put,然后一次發給服務器
- 通過 table.setAutoFlush(false) 來激活緩沖區(只有在寫非常頻繁的情況下會用到)
- hbase-site.xml 中的 hbase.client.write.buffer來調整大小
Put列表
可以傳入一個列表的 Put void Put(List<Put> puts) 不過如果同時插入多個put,當其中某個出錯的時候,前面幾個會被正常插入,往后的put就都不會插入 而且客戶端也不能保證服務器端的寫入順序GET
- get.exist(Get get) 方法,在需要檢查一個比較大的列的時候能節省網絡傳輸
- Result getRowBefore 可以獲取某個行之前的行
批量處理操作
- put,get, delete 列表其實都是通過 batch() 方法實現的
- 直接使用batch(List<Action> actions, Object[] results, ... ) 可以同時傳入3種實例中的任意一種
- batch并不使用寫緩沖區
兩種批量查詢的區別
用batch(List<Row> actions, Object[] results)批量查 和 Object[] batch(List<Row> actions) 的區別是- ?batch(List<Row> actions, Object[] results)可以返回部分結果
- Object[] batch(List<Row> actions) 一旦出錯,一條都沒有
行鎖
盡量不要使用行鎖,如果必須使用,請一定節約占用鎖的時間掃描
- 通過 hbase-site.xml 中的 hbase.regionserver.lease.period 設定 ResultScanner 的租約
- 由于每次next()都要發一次請求,所以掃描器也有緩存,叫scanner caching ,默認是關閉的
- 通過 setBatch(5) 可以每次 next() 返回5列,注意是 列!
各種特性
HRegionLocation getRegionLocation(row) Map<HRegionInfo, HServerAddress> getRegionInfo() 這些方法可以獲取某一行數據的具體位置,或者所在的region信息總結
以上是生活随笔為你收集整理的《HBase权威指南》读书笔记3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: String类能被继承吗,为什么?
- 下一篇: 讲讲类的实例化顺序,比如父类静态数据,构