HBase之Region上Spilt流程分析

2021-08-10 18:37:21 字數 2802 閱讀 4613

我們知道在memstore達到閥值以後,會進行flushregion操作. 那麼在操作完成之後,會對hregion進行檢查,看是否hregion是否已經達到閥值,如果已經達到閥值,則需要對hregion進行split操作。

一 檢測hregion是否需要進行split的流程分析

boolean shouldsplit = region.checksplit() != null; 會進行region的split檢測:

1.1 如果是meta表,我們不需要對meta表的region進行split操作,所以返回false

1.2 如果該region正處於recovering狀態,我們也不能對它進行split操作

1.3 根據splitpolicy#shouldsplit方法檢測是否需要進行split:

#  region是否需要強制split,如果需要強制split返回true

# 遍歷該hregion所有store,如果某乙個store上有檔案存在引用,則返回false;再判斷store的大小是否大於檢查點的大小,如果大於返回true,否則false

1.4 獲取split point,並返回split point

1.5 如果滿足split條件,則呼叫compactsplitthread#requestsplit方法進行split流程

二 分析compactsplitthread是如何進行split的?

2.2 獲取split point作為分割點

2.3 執行splitrequest執行緒, 建立splittransaction,給表上讀鎖,防止併發修改表的元資料,如果事務沒準備好,則不能進行split

2.4 呼叫splittransaction#prepare,進行split之前的準備工作

# 檢測hregion是否能夠split;split point是否為null;檢測split point 是否個hregion的start key相等或者hregion根本就不包含這個split point

# 如果允許split,初始化兩個子hregioninfo

2.5 呼叫splittransaction#execute方法,執行split操作

2.6 呼叫createdaughters建立兩個子的hregion

2.7 呼叫stepsafterponr方法開啟兩個新建的hregion

2.8 釋放讀鎖

三 分析建立兩個子的hregion的流程-createdaughters

3.1 呼叫splittransactioncoordination#startsplittransaction方法,建立臨時的/hbase/region-in-transition/regionname znode節點,節點型別

rs_zk_request_region_split

3.2 呼叫splittransactioncoordination#waitforsplittransaction方法,等待hmaster將這個需要split操作的節點從pending_split轉化為spliting,也就是不斷輪詢hmaster更換狀態為rs_zk_region_splitting,讓hmaster知道正在執行split操作

3.3 呼叫hregionfilesystem# createsplitsdir建立.split檔案目錄

3.4 關閉當前的被切割的hregion

# 呼叫waitforflushesandcompactions,等待進行中的memstore的flush 和 compaction操作完成

# 檢視該hregion所有memstore是否大於hbase.hregion.preclose.

flush.size,預設5mb.如果滿足,則就進行flush

# 關閉每乙個hstore, 不在服務於任何呼叫

3.5 呼叫splitstorefiles,並行遍歷每乙個storefile,對於每乙個storefile然後建立splitstorefiles,呼叫其splitstorefile方法建立兩個

daugthera和daugtherb 的reference 檔案

3.6呼叫createdaughterregionfromsplits方法,建立daughter hregion

# hregionfilesystem#commitdaughterregion(hri) 把臨時目錄.splits移到最終的目錄/table/region下這樣daughterregion就和parent同級目錄。

# 然後建立a和b兩個hregion物件

3.7 修改hbase:meta中對應的元資料資訊

四 開啟新的region服務請求- stepsafterponr

4.1 呼叫opendaughters開啟新的split之後的hregion,建立對應的hstore,讀取reference(reference檔案有專門的scanner和reader來限制讀取對應hfile的範圍),從所有hfile裡讀取最大的memstorets、sequenceid。hregion成功開啟後,就更新hbase:meta表中a和b的location。然後根據每個hfile的maxsequenceid進行replay waledit,就是把內容重新寫入hstore的memstore。如果waledit的lognum裡小於maxsequenceid則表明已經寫入hfile(每條記錄對應乙個sequenceid),就會跳過。然後會請求乙個非同步major compact,從reference生成真正的hfile

4.2 splittransactioncoordination#completesplittransaction:更新zk節點狀態。在zk上之前建立的/hbase/region-in-transition/regionname節點的type改為rs_zk_region_split,通知hmaster完成split操作

Hbase優化之Region分割設定的問題

hbase優化之region分割設定的問題 hbase一張表可以分別儲存在幾個region上,乙個region又分成了好多store,乙個store又分成了memstore和storefile,當memstore滿64mb後,會把資料flush到disk上而成為storefile,當storefil...

Hbase均衡Region和許可權管理

查詢namespace為amrcloud中名為powerdata的表的資料 scan amrcloud powerdata 查詢某一條資料 get t1 r1 t1為表名,r1為rowkey,c1為column family 列出所有表 list 列出所有namespace list namespa...

Region之 線特徵

1.line orientatin rowbegin,rowend,colend phi 計算直線的方向 2.line position rowbegin,colbegin,rowend,colend rowcenter,colcenter,lenght,phi 計算線段的中心,長度,方向 3.an...