Hbase原始碼分析3 從Put到HFile

2021-08-27 02:45:22 字數 1378 閱讀 7551

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...