hbase在scan操作中cache,batch屬性
使用java操作hbase的scan操作程式碼級別的中呼叫有這麼一個api:
ResultScanner result = table.getScanner(scan); 這個 ResultScanner是迭代器,迭代器中每一個元素是一個result類,看一下result類的實現,發現他有一個方法publicKeyValue[] raw(),這個方法返回一個keyValue類的陣列,ok繼續看這個keyValue類的實現keyValue繼承了cell這個介面,cell又是什麼那,來看一下原始碼中的英文註釋,有興趣的親子去翻譯一下,大概的意思是:他是hbase基本儲存單元,由以下幾個屬性組成:
1) row
2) column family
3) column qualifier
4) timestamp
5) type
6) MVCC version
7) value
這幾個欄位的是啥意思就不再解釋了,可以參考別的資料去學習,這裡主要就是得到row,value這就是對應row的對應值,這裡發現只能去到column family獲取不到column,不知道是不是我沒看明白程式碼。綜上看出來其實scan操作返回的就是一個迭代器,迭代器中存放的是一個result類,這個類Cell的陣列,通過陣列中的每一個cell可以得到資料
到這裡我們就要說一下,hbase是怎麼確定一次從客戶端拿到多少資料的那,也就是說一次拿幾行的資料,這些行中又有多少column的資料那?
這是用cache,batch來計算的,這兩個值在hbase的配置檔案中都能夠配置,簡明地說cache是hbase客戶端做的一個快取,batch是server端的一個快取;scan操作做操作的時候,hbase客戶端是通過rpc去hbase server端取資料的,一次rpc中能夠獲取的行數就是cache的值,server 端一次能夠傳送的column的數量就是batch,據一個例子吧:假設cache =2 ,batch = 10,要查詢的資料在server端一共有10行資料,20個column,也就是由200cell需要取得,那麼我們一次rpc能夠處理兩行的資料,每次能夠獲取10個column,也就是能夠去到20個cell,一共200個cell,就需要10次rpc取完畢,最後再有一次rpc確認scan結束。