重慶網(wǎng)站建設(shè) 公司列舉常見的網(wǎng)絡(luò)營銷工具
1. region split機制
? HRegionServer拆分region的步驟是,先將該region下線,然后拆分,將其子region加入到hbase:meta表中,再將他們加入到原本的HRegionServer中,最后匯報Master。
split前:hbase:meta表有: region_p
-
在region_p對應(yīng)的hdfs目錄下生成.splits目錄,用于保存分割后的region信息,如:tablename/region_p/.splits
-
關(guān)閉region_p,數(shù)據(jù)寫入并觸發(fā)flush操作,將寫入region的數(shù)據(jù)全部持久化到磁盤。
- 在region_p對應(yīng)的.splits目錄下,創(chuàng)建兩個子目錄,并在里面創(chuàng)建兩個子region的引用文件。
.split引用文件目錄 |
---|
tablename/region_p/.splits/region1/region1引用文件 (splitkey, true) |
tablename/region_p/.splits/region2/region2引用文件 (splitkey, false) |
引用文件用于記錄從哪分割(splitkey)和是上半部分(true)還是下半部分(false)
- region_p 分裂為兩個子region后,將.split目錄下的region1、region2 的目錄 copy 到region_p的同級目錄下,形成兩個新的region。
tablename目錄結(jié)構(gòu) |
---|
tablename/region_p/.splits |
tablename/region1/cf/region1引用文件(splitkey, true) |
tablename/region2/cf/region2引用文件(splitkey, false) |
- 把region_p在hbase:meta表標記下線和split,把兩個子region添加到hbase:mate表。
location | split | offline | split | |
---|---|---|---|---|
region_p | /xxxx/xxxx/xxxx/ | true | true | region1,region2 |
region1 | /xxxx/xxxx/xxxx/ | false | false | |
region2 | /xxxx/xxxx/xxxx/ | false | false |
-
開啟兩個子region,可以接收請求了。此時還沒有拉取region_p split的數(shù)據(jù)。
-
當region發(fā)生major compact時,會把父region的split數(shù)據(jù)拉取到子region,并和當前的子region進行合并,子region拉取完數(shù)據(jù)后,把引用文件刪除。
- hbase會啟動線程檢查父region是否達到刪除的條件,如果達到就刪除父region。
刪除條件:父region的元數(shù)據(jù)是split狀態(tài)and所有子region下的引用文件已刪除。
2.?region split策略
可以通過設(shè)置RegionSplitPolicy的實現(xiàn)類來指定拆分策略,RegionSplitPolicy類的實現(xiàn)類有:
ConstantSizeRegionSplitPolicyIncreasingToUpperBoundRegionSplitPolicyDelimitedKeyPrefixRegionSplitPolicyKeyPrefixRegionSplitPolicy
DisabledRegionSplitPolicy // 不拆分
其中:
ConstantSizeRegionSplitPolicy:(一刀切)【0.94前】
? 當一個region中最大store大小大于設(shè)置閾值(hbase.hregion.max.filesize 默認10G)就會觸發(fā)切分,每10s檢查一次region大小,hbase.server.thread.wakefrequency=10000。
- 設(shè)置閾值大些,對大表友好,但對小表并不友好,可能小表不會分裂;
- 如果閾值小些,對小表友好,但對大表并不友好,可能會大量分裂;
IncreasingToUpperBoundRegionSplitPolicy【0.94-2.0】:
? 默認使用的拆分策略,Region的前幾次拆分的閾值不是固定的數(shù)值,是需要進行計算得到,當同一table在同一regionserver上的region數(shù)量在[0,100)之間時按照如下的計算公式算,否則按照ConstantSizeRegionSplitPolicy策略計算:
Min (R^3?"hbase.hregion.memstore.flush.size"2, "hbase.hregion.max.filesize")
-
R為同一個table中在同一個regionserver中region的個數(shù)
-
hbase.hregion.memstore.flush.size默認為128M
- hbase.hregion.max.filesize默認為10G
第一次分裂: 1*1*1*128*2=256M
第二次分裂:8*128*2 = 2G
第三次分裂: 27*128*2 = 6.75G
SteppingSplitPolicy【2.x版本】:
? 這種策略和IncreasingToUpperBoundRegionSplitPolicy策略很相似,但更簡單,第一個Region容量的上限為256M,之后都是10G,這個策略考慮到IncreasingToUpperBoundRegionSplitPolicy會多拆分幾個Region(256M -> 2G -> 6.75G -> 10G),所以進行了簡化。