hbase 0.94.0版本中,對(duì)于region的split方式引入了一個(gè)非常方便的SplitPolicy,通過(guò)這個(gè)SplitPolicy,可以主動(dòng)的干預(yù)控制region split的方式。在org.apache.Hadoop.hbase.regionserver包中,可以找到這么幾個(gè)自帶的splitPolicy: ConstantSizeRegionSplitPolicy, IncreasingToUpperBoundRegionSplitPolicy, and KeyPrefixRegionSplitPolicy。
在儀征等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),成都全網(wǎng)營(yíng)銷(xiāo)推廣,外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),儀征網(wǎng)站建設(shè)費(fèi)用合理。
從名字上就可以分辨出這三種split策略的適用場(chǎng)景:
ConstantSizeRegionSplitPolicy:按固定長(zhǎng)度分割region,固定長(zhǎng)度取值優(yōu)先獲取table的”MAX_FILESIZE” 值,若沒(méi)有設(shè)定該屬性,則采用在hbase-site.xml中配置的hbase.hregion.max.filesize值,在0.94版本中這個(gè)值的缺省值已經(jīng)被調(diào)整為:10 * 1024 * 1024 * 1024L 也就是10G,網(wǎng)上很多關(guān)于 hbase.hregion.max.filesize 默認(rèn)值 1G的文章應(yīng)該都是基于0.92的hbase的。這個(gè)在使用中需要明確具體的hbase版本號(hào)。這個(gè)策略是0.94版本之前默認(rèn)使用的,采用該策略后,當(dāng)table的某一region中的某一store大小超過(guò)了預(yù)定的最大固定長(zhǎng)度時(shí),對(duì)該region進(jìn)行split。splitPoint算法的選擇還是依據(jù)“數(shù)據(jù)對(duì)半”原則,找到該region的最大store的中間長(zhǎng)度的rowkey進(jìn)行split。
IncreasingToUpperBoundRegionSplitPolicy:按照region數(shù)量累增劃分region,該策略為Hbase 0.94默認(rèn)使用的策略,采用該策略分割的region大小是不相等的,每次新region的大小隨著region數(shù)量的增多而增大。具體增長(zhǎng)方法為:Min (R^2 * ”MEMSTORE_FLUSHSIZE”||”hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”);其中R 為當(dāng)前這個(gè)region所在regionserver中對(duì)應(yīng)此table的region數(shù),MEMSTORE_FLUSHSIZE 為table創(chuàng)建時(shí)指定大小,若table指定了此屬性則忽略下面的hbase.hregion.memstore.flush.size 。
hbase.hregion.memstore.flush.size 為hbase-site中設(shè)定大小 默認(rèn)128M
hbase.hregion.max.filesize 為hbase-site中設(shè)定的單個(gè)region大小,默認(rèn)10G
每次region大小是取上述兩個(gè)size中較小的那個(gè)。
假設(shè)使用hbase.hregion.memstore.flush.size 128M, hregion.max.filesize為10G, 那么每次region增長(zhǎng)情況為:512M,1152M,2G,3,2G,4,6G,6,2G,etc。當(dāng)region增長(zhǎng)到9個(gè)時(shí),9*9*128M/1024=10.125G >10G,至此以后region split大小都固定為10G。
KeyPrefixRegionSplitPolicy:指定rowkey前綴位數(shù)劃分region,通過(guò)讀取table的prefix_split_key_policy.prefix_length屬性,該屬性為數(shù)字類(lèi)型,表示前綴長(zhǎng)度,
在進(jìn)行split時(shí),按此長(zhǎng)度對(duì)splitPoint進(jìn)行截取。個(gè)人理解是rowkey前綴不相等,則劃分region。此種策略比較適合固定前綴的rowkey。當(dāng)table中沒(méi)有設(shè)置prefix_split_key_policy.prefix_length屬性,或prefix_split_key_policy.prefix_length屬性不為Integer類(lèi)型時(shí),指定此策略效果等同與使用IncreasingToUpperBoundRegionSplitPolicy。
附上代碼,在創(chuàng)建或修改table時(shí),指定splicpolicy
[java] view plain copy
// 更新現(xiàn)有表的split策略
HBaseAdmin admin = new HBaseAdmin( conf);
HTable hTable = new HTable( conf, ”test” );
HTableDescriptor htd = hTable.getTableDescriptor();
HTableDescriptor newHtd = new HTableDescriptor(htd);
newHtd.setValue(HTableDescriptor. SPLIT_POLICY, KeyPrefixRegionSplitPolicy.class .getName());// 指定策略
newHtd.setValue(“prefix_split_key_policy.prefix_length”, ”2″);
newHtd.setValue(“MEMSTORE_FLUSHSIZE”, ”5242880″); // 5M
admin.disableTable( ”test”);
admin.modifyTable(Bytes. toBytes(“test”), newHtd);
admin.enableTable( ”test”);
目前使用的HBASE1.0.1.1使用的REGION SPLIT策略是IncreasingToUpperBoundRegionSplitPolicy。
驗(yàn)證方式如下:通過(guò)HBASE前端查看系統(tǒng)中的TDC_TWEETS_201604表,發(fā)現(xiàn)該表被拆分成18個(gè)REGION,截圖如下:
通過(guò)HADOOP命令查看每個(gè)REGION大小,發(fā)現(xiàn)最大的7.4G,最小的88M,符合REGION拆分邏輯,截圖如下: