HBase 篇(七):Region 的分裂
本篇重點:
1.Region的切分點是整個region中最大store中的最大檔案中最中心的一個block的首個rowkey。
2.Region分裂是個事務過程
3.Region會先標記,在MajorCompaction時才真正移動資料。
Region切分觸發策略
0.94版本~2.0版本預設切分策略是IncreasingToUpperBoundRegionSplitPolicy,一個region中最大store大小大於設定閾值就會觸發切分。這個閾值在一定條件下會不斷調整,調整規則和region所屬表在當前regionserver上的region個數有關係 :
(#regions) * (#regions) * (#regions) * flush size * 2
當然閾值並不會無限增大,最大值為使用者設定的MaxRegionFileSize。這種切分策略很好的彌補了ConstantSizeRegionSplitPolicy的短板,能夠自適應大表和小表。而且在大叢集條件下對於很多大表來說表現很優秀,但並不完美,這種策略下很多小表會在大叢集中產生大量小region,分散在整個叢集中。而且在發生region遷移時也可能會觸發region分裂。 在用法上,一般情況下使用預設切分策略即可,也可以在cf級別設定region切分策略,命令為:
SplitPoint
region切分,那肯定需要一個切分點splitpoint,splitpoint是 整個region中最大store中的最大檔案中最中心的一個block的首個rowkey 。所以如果定位到的rowkey是整個檔案的首個rowkey或者最後一個rowkey的話,就認為沒有切分點。
Region核心切分流程
Region切分是一個事務過程,分成三個階段
-
prepare階段:在記憶體中初始化兩個子region,具體是生成兩個HRegionInfo物件,包含tableName、regionName、startkey、endkey等。同時會生成一個transaction journal,這個物件用來記錄切分的進展。
-
execute階段:切分的核心操作,下面詳解。
-
rollback階段:如果execute階段出現異常,則執行rollback操作。為了實現回滾,整個切分過程被分為很多子階段,回滾程式會根據當前進展到哪個子階段清理對應的垃圾資料,根據切分進展來做不同的回滾操作。
execute階段詳解
1. execute階段首先regionserver 更改ZK節點 /region-in-transition 中該region的狀態為SPLITING。
2. master通過watch節點/region-in-transition檢測到region狀態改變,並修改記憶體中region的狀態,在master頁面RIT模組就可以看到region執行split的狀態資訊。
3. 在父儲存目錄下新建臨時資料夾.split儲存split後的daughter region資訊。
4. 關閉parent region:parent region關閉資料寫入並觸發flush操作,將寫入region的資料全部持久化到磁碟。此後短時間內客戶端落在父region上的請求都會丟擲異常NotServingRegionException。
5. 核心分裂步驟:在.split資料夾下新建兩個子資料夾,稱之為daughter A、daughter B,並在資料夾中生成reference檔案,分別指向父region中對應檔案。這個步驟是所有步驟中最核心的一個環節,會生成這樣的檔案
除此之外,這個名為fileName.regionName的reference檔案是一個引用檔案(並非linux連結檔案),存的不是資料,而是兩個東西:切分點splitkey和一個boolean型別的變數(true或者false),true表示該reference檔案引用的是父檔案的上半部分(top),而false表示引用的是下半部分 (bottom),存了這些東西在資料真正移動的時候就可以根據regionName,HfileName,splitKey,上or下部分,這些資訊定位到資料的位置。
6. 父region分裂為兩個子region後,將daughter A、daughter B拷貝到HBase根目錄下,形成兩個新的region。這一步什麼時候執行呢?compaction的執行實際上是將store中所有小檔案一個KV一個KV從小到大讀出來之後再順序寫入一個大檔案,完成之後再將小檔案刪掉,因此compaction本身就需要讀取並寫入大量資料。子region執行 major_compaction 後會將父目錄中屬於該子region的所有資料讀出來並寫入子region目錄資料檔案中。可見將資料遷移放到compaction這個階段來做,是一件順便的事。
7. parent region通知修改 hbase.meta 表後下線,不再提供服務。下線後parent region在meta表中的資訊並不會馬上刪除,而是標註split列、offline列為true,並記錄兩個子region。為什麼不立馬刪除?實際上HMaster會啟動一個執行緒定期遍歷檢查所有處於splitting狀態的父region,確定檢查父region是否可以被清理。檢測執行緒首先會在meta表中揪出所有split列為true的region,並加載出其分裂後生成的兩個子region(meta表中splitA列和splitB列),只需要檢查此兩個子region是否還存在引用檔案,如果都不存在引用檔案就可以認為該父region對應的檔案可以被刪除。
.META.Region 表資訊
Region Name | Location | split | offline | splitA | splitB |
---|---|---|---|---|---|
ParentRegion | RegionServerA | true | true | DaughterA | DaughterB |
DaughterA | RegionServerA | false | false | ||
DaughterB | RegionServerA | false | false |
8. 開啟daughter A、daughter B兩個子region。通知修改 hbase.meta 表,正式對外提供服務。
覺得有價值請關注 ▼