hbase 0.94.0版本中,對於region的split方式引入了一個很是方便的SplitPolicy,經過這個SplitPolicy,能夠主動的干預控制region split的方式。在org.apache.Hadoop.hbase.regionserver包中,能夠找到這麼幾個自帶的splitPolicy: ConstantSizeRegionSplitPolicy, IncreasingToUpperBoundRegionSplitPolicy, and KeyPrefixRegionSplitPolicy。html
從名字上就能夠分辨出這三種split策略的適用場景:前端
ConstantSizeRegionSplitPolicy:按固定長度分割region,固定長度取值優先獲取table的」MAX_FILESIZE」 值,若沒有設定該屬性,則採用在hbase-site.xml中配置的hbase.hregion.max.filesize值,在0.94版本中這個值的缺省值已經被調整爲:10 * 1024 * 1024 * 1024L 也就是10G,網上不少關於 hbase.hregion.max.filesize 默認值 1G的文章應該都是基於0.92的hbase的。這個在使用中須要明確具體的hbase版本號。這個策略是0.94版本以前默認使用的,採用該策略後,當table的某一region中的某一store大小超過了預約的最大固定長度時,對該region進行split。splitPoint算法的選擇仍是依據「數據對半」原則,找到該region的最大store的中間長度的rowkey進行split。java
IncreasingToUpperBoundRegionSplitPolicy:按照region數量累增劃分region,該策略爲Hbase 0.94默認使用的策略,採用該策略分割的region大小是不相等的,每次新region的大小隨着region數量的增多而增大。具體增加方法爲:Min (R^2 * 」MEMSTORE_FLUSHSIZE」||」hbase.hregion.memstore.flush.size」, 「hbase.hregion.max.filesize」);其中R 爲當前這個region所在regionserver中對應此table的region數,MEMSTORE_FLUSHSIZE 爲table建立時指定大小,若table指定了此屬性則忽略下面的hbase.hregion.memstore.flush.size 。算法
hbase.hregion.memstore.flush.size 爲hbase-site中設定大小 默認128Mapache
hbase.hregion.max.filesize 爲hbase-site中設定的單個region大小,默認10Gapi
每次region大小是取上述兩個size中較小的那個。app
假設使用hbase.hregion.memstore.flush.size 128M, hregion.max.filesize爲10G, 那麼每次region增加狀況爲:512M,1152M,2G,3,2G,4,6G,6,2G,etc。當region增加到9個時,9*9*128M/1024=10.125G >10G,至此之後region split大小都固定爲10G。ide
KeyPrefixRegionSplitPolicy:指定rowkey前綴位數劃分region,經過讀取table的prefix_split_key_policy.prefix_length屬性,該屬性爲數字類型,表示前綴長度,wordpress
在進行split時,按此長度對splitPoint進行截取。我的理解是rowkey前綴不相等,則劃分region。此種策略比較適合固定前綴的rowkey。當table中沒有設置prefix_split_key_policy.prefix_length屬性,或prefix_split_key_policy.prefix_length屬性不爲Integer類型時,指定此策略效果等同與使用IncreasingToUpperBoundRegionSplitPolicy。oop
附上代碼,在建立或修改table時,指定splicpolicy
[java] view plain copy
// 更新現有表的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。
驗證方式以下:經過HBASE前端查看系統中的TDC_TWEETS_201604表,發現該表被拆分紅18個REGION,截圖以下:
經過HADOOP命令查看每一個REGION大小,發現最大的7.4G,最小的88M,符合REGION拆分邏輯,截圖以下: