結合原始碼分析HBase相關操作流程

2021-06-28 11:07:14 字數 2647 閱讀 8115

1、regionserver開啟region的過程:

首先master給regionserver發出開啟region的命令(assignmentmanager.assign)

regionopeningstate regionopenstate = servermanager.sendregionopen(plan

.getdestination(), state.getregion(), versionofofflinenode);

遠端連線對應的regionserver,傳送開啟region的命令

hregionserver.openregion--->executorservice.submit操作(runable)-->openregionhandler.process

process的實現邏輯為,

建立region物件,並初始化(檢查.regioninfo檔案--->遍歷所有的store檔案,建立並初始化store物件--->設定hlog的seqnum《如果region中的store最大的seqnum比當前hlog中的seqnum大,則更改當前hlog的seqnum是最大的那個》)

2、hlog的讀寫過程

如果regionserver down, 如何判斷哪些hlog中的資訊沒有flush到資料檔案中

---hdfs中.logs下對於每個regionserver都有乙個目錄,結合該server下的所有region,對每個region stores中最大的seqnum和.logs做比較,找出來所有還沒checkpoint的seqnum,後由master對清洗的logs進行split操作,copy到hdfs中的每個region的splitlogs目錄下,那麼後續新的regionserver開啟該region的時候,會把這些split log replay到memstore中。

3、建立表,修改schema

客戶端經過rpc hmasterinte***ce介面呼叫hmaster中的createtable介面,建立regioninfo(根據表名和指定的splitkey範圍的數量)

提交executeservice,多執行緒併發執行建立表邏輯(在hdfs中建立表對應的目錄,建立各個region的目錄,建立regioninfo,建立region並初始化《建立hlog物件--用在region中所有region都相同,建立stores物件》,批量插入region資訊到meta表中《呼叫htable客戶端api>,按照輪詢演算法往regionservers分配region《參見9>,並在zookeeper中標記該錶為enable)

4、get、scan資料

hregionserverinte***ce

從zookeeper中查詢root表所在的regionserver1,到該server1上根據table和key,查詢root表,找出meta表中的region所在的server2,到server2上查詢meta表,根據table和key找出資料記錄所在region對乙個的server3,接下來到server3查詢即可。

result get(byte regionname, get get),在server內部,查詢記憶體中的region物件,並呼叫它的regionscanner物件的next方法進行查詢(next中存在快取,下一次會從直接從快取中取),最終遍歷各個storefile進行查詢

5、insert,update資料

hregioninte***ce

put操作,(客戶端**的分析)關鍵是put操作的資料插入到該table中的regions中的哪一部分,每個region都是有範圍的,根據key落在哪個範圍中進行插入操作,如果超過region的大小限制,則進行相關的split操作

update操作,查詢所在的region,追加操作,major compact的時候進行合併操作

以上兩種都需要記錄wal log(應用----flush--->檔案系統cache----sync---->檔案硬碟儲存)

6、分配region到regionserver的過程分析

bulkassign

建立分配計畫,即regionserver和regions的對應關係

多執行緒併發進行分配,呼叫assignmentmanager.assign(regionserver, regions);

assignmentmanager建立分配計畫,後按計畫通過servermanager遠端呼叫regionserver開啟regions《參考1>,成功後更新meta表。

7、complatebulkload的過程分析

先利用mapreduce生成一堆hfile,然後呼叫completebuikload載入到table中。

loadincrementalhfiles.dobulkload(path hfofdir, final htable table),利用多執行緒根據hfile的startkey、endkey先把hfiles劃分到各個region(startkey,endkey)中,可能要split hfile。

多執行緒呼叫hregioninte***ce. bulkloadhfiles(list> familypaths, byte regionname)進行load

load的過程是,呼叫region中的store物件的bulkloadhfile方法,在hdfs中的region目錄下新建乙個storefile,把原來的檔案資料copy到這個storefile。更新meta表。

reduce的數量,有partiton決定region的數量決定的。

**:

HBase限流機制原始碼分析

master啟動的時候會初始化masterquotamanager,並啟動該manager masterquotamanager實現了regionstatelistener介面,可以監聽region的狀態變化,regionstatelistener介面中定義了三個事件,分別是onregionspli...

proc lib spawn相關原始碼分析

proc lib中所有關於程序相關的方法都是在bif裡的spawn相關方法上封裝實現的。主要做程序字典 ancestors initial call 的初始化和crash報告 退出處理。一 proc lib spawn 相關函式實現 1 proc lib spawn 相關函式通過呼叫相應的erlan...

java集合相關原始碼分析

hashmap 原始碼分析 hashset 原始碼分析 arraylist 原始碼分析 concurrentmap 原始碼分析 2018 03 25 map 綜述 一 徹頭徹尾理解 hashmap map 綜述 二 徹頭徹尾理解 linkedhashmap map 綜述 三 徹頭徹尾理解 concu...