您好,登錄后才能下訂單哦!
hbase 0.94.0版本中,對于region的split方式引入了一個非常方便的SplitPolicy,通過這個SplitPolicy,可以主動的干預控制region split的方式。在org.apache.Hadoop.hbase.regionserver包中,可以找到這么幾個自帶的splitPolicy: ConstantSizeRegionSplitPolicy, IncreasingToUpperBoundRegionSplitPolicy, and KeyPrefixRegionSplitPolicy。
從名字上就可以分辨出這三種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。
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中設定大小 默認128M
hbase.hregion.max.filesize 為hbase-site中設定的單個region大小,默認10G
每次region大小是取上述兩個size中較小的那個。
假設使用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。
KeyPrefixRegionSplitPolicy:指定rowkey前綴位數劃分region,通過讀取table的prefix_split_key_policy.prefix_length屬性,該屬性為數字類型,表示前綴長度,
在進行split時,按此長度對splitPoint進行截取。個人理解是rowkey前綴不相等,則劃分region。此種策略比較適合固定前綴的rowkey。當table中沒有設置prefix_split_key_policy.prefix_length屬性,或prefix_split_key_policy.prefix_length屬性不為Integer類型時,指定此策略效果等同與使用IncreasingToUpperBoundRegionSplitPolicy。
附上代碼,在創建或修改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拆分邏輯,截圖如下:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。