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