hbase插入資料的過程大致是:
客戶端提交請求給region server(這中間會有作一些快取)
region server接收到請求,判斷其實put請求,將其put到memstore
每次memstore的操作,都會檢查memstore是否操作乙個閾值,如果超過,就開始執行flush(),這個flush其實就是從記憶體中的keyvalue對持久化到hstore(也就是hfile)上面
好了,下面看一下一條資料是怎麼從client端到達server端,並且最終轉換成hfile的吧~
client端(htable):
執行put方法
put方法進一步呼叫doput(put)方法
在doput裡面,會驗證乙個put的合理性(比如是否指定了column);然後會檢查keyvalue的大小是否越界,這個可以通過配置引數hbase.client.keyvalue.maxsize來配置,預設是無限大的~
然後doput方法呼叫writebuffer.add(put),將這個put寫入到本地快取,只有在以下幾種情況下,這個快取才會flush
在flush方法中,通過執行connection.processbatchofputs(),連線遠端region server,提交請求:
注:cilent在執行插入的時候,會對最近使用的region server做cache,如果有在cache有儲存著相應的region server資訊,就直接取出這個region資訊,連線這個region server。否則才對master執行一次rpc,獲得region server資訊
客戶端的操作,put,delete,get都是封裝在乙個物件action裡面的每次提交,都是一系列的action一起提交,也就是multiaction。
server端(hregionserver):
執行hregionserver.multi(multiactionmulti),處理插入請求。
在hregion.put()方法中,又會一次呼叫以下方法
dominibatchput(batchop)方法會進行以下操作:
注:在hregion的put方法中,執行完dominibatchput之後,會檢查memstore 的大小是否超過閾值,如果超過,就執行一次flush,flush的時候,會對memstore進行乙個快照,就是暫時停止memstore服務,然後立即生成乙個新的memstore物件,代替當前memstore接替當前memstore的工作,被替換的memstore會被寫到hstore(hfile)中。
memstore的flush是在方法hregion.internalflushcache()裡執行的。
切換memstore是非常快的,生成乙個新物件,同時把memstore的指向直接切換到新的kvset。
Hbase原始碼分析3 從Put到HFile
hbase插入資料的過程大致是 客戶端提交請求給region server 這中間會有作一些快取 region server接收到請求,判斷其實put請求,將其put到memstore 每次memstore的操作,都會檢查memstore是否操作乙個閾值,如果超過,就開始執行flush 這個flus...
Hbase原始碼分析3 從Put到HFile
hbase插入資料的過程大致是 客戶端提交請求給region server 這中間會有作一些快取 region server接收到請求,判斷其實put請求,將其put到memstore 每次memstore的操作,都會檢查memstore是否操作乙個閾值,如果超過,就開始執行flush 這個flus...
HBase 0 1 0 Put流程原始碼分析
put的過程相對比較簡單,因為根據lsm tree的理論,寫入操作會寫入到記憶體中,然後再batch的寫入磁碟。hbase的實現也是如此。首先,從客戶端的batch操作中提取出所有的put操作並放在乙個sortedmap中 localput text row b.getrow long lockid...