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