split
hbase是通過regionServer管理table的,一個table對應一個或多個region,hmaster將這些region根據集群負載分配給regionServer進行管理。若一個table沒有進行預分區,那么只有一個region,初始化表時數據的讀寫都命中同一個regionServer,會造成熱點問題,且region進行split時集群是不可用的,頻繁的split也會造成大量的集群I/O,性能很低。
1、pre-splitting
在創建table時指定pre-splitting,預先生成多個region,結合合適的rowkey,這樣可以很大程度上避免讀寫熱點,每個region內部再按照一定的split-policy進行自動切分。
hbase提供了兩種pre-split算法:HexStringSplit和UniformSplit,前者適用於十六進制字符的rowkey,后者適用於隨機字節數組的rowkey。
1.1、HexStringSplit
shell建表語句:
//創建一個名為hex_test的表,有兩個列簇info和desc,可存3個版本的數據,副本為2,預先指定10個region,且split算法為HexStringSplit
create 'hex_test',{NAME=>'info',VERSIONS=>3},{NAME=>'desc',VERSIONS=>3},{NUMREGIONS=>10,SPLITALGO=>'HexStringSplit',REGION_REPLICATION=>2}
可以在web ui看到這張表的信息:
1.2、UniformSplit
shell建表:
create 'uniform_test',{NAME=>'info',VERSIONS=>3},{NAME=>'desc',VERSIONS=>3},{NUMREGIONS=>10,SPLITALGO=>'UniformSplit',REGION_REPLICATION=>2}
1.3、自定義切分點
//1、直接指定切分點
create 'c_test1','info',{SPLITS=>['10','20','30']}
//2、指定切分文件
create 'c_test2','info',SPLITS_FILE=> '/home/syui/data/hbase/split_file/t1.txt'
2、自動splitting
regionServer根據split policy對region進行切分。不同的切分策略可以應用在不同的業務場景,所以可以根據需求設置table級別的split policy;也可以在hbase-site.xml中使用hbase.regionserver.region.split.policy設置全局的split policy;還可以自己實現split policy。
//創建一個policy_table表,使用IncreasingToUpperBoundRegionSplitPolicy切分策略
create 'policy_test','info',{CONFIGURATION=>{'hbase.regionserver.region.split.policy'=>'IncreasingToUpperBoundRegionSplitPolicy'}}
hbase提供了6種切分策略。
2.1、ConstantSizeRegionSplitPolicy
當region的最大一個store達到指定的閾值時觸發split,這個閾值可以使用hbase.hregion.max.filesize設置(默認10G)。0.94版本前的默認切分策略。
2.2、IncreasingToUpperBoundRegionSplitPolicy
也是當region的最大一個store達到一個閾值時觸發split,不過這個閾值不是固定的,而是根據regionServer管理的同屬一張表的region個數有關:
a)、region個數為0或者大於100:maxFilesize的選取跟ConstantSizeRegionSplitPolicy一樣;
b)、region個數在0~100之間:有一個initialSize,這個值由hbase.incresing.policy.initial.size配置;若沒有配置這個值,則initialSize = 2 * MEMSTORE_FLUSHSIZE(table元數據);若table沒有元數據或initialSize小於0,則initialSize = 2 * hbase.hregion.memstore.flush.size(默認128M)。拿到initialSize后,maxFilesize = min (initialSize * region個數的3次方, 10G)。
0.94 ~ 2.0版本默認的切分策略,這種策略下,表的region越少,split越頻繁,當region數超過4之后的maxFilesize都是10G。
2.3、SteppingSplitPolicy
這是IncresingToUpperBoundRegionSplitPolicy的子類,重寫了getSizeToCheck方法,當region個數為1時,maxFilesize = flushSize * 2,其他情況跟父類一樣。
2.0版本后的默認切分策略,修改了1個region時的切分閾值,之前是128 * 1^3 = 128M,現在是128 * 2 * 1^3 = 256M。
2.4、KeyPrefixRegionSplitPolicy
這是IncresingToUpperBoundRegionSplitPolicy的子類,切分條件跟父類一樣,修改了splitKey的選取,會根據rowkey的前綴對數據分組,將rowkey前綴相同的數據在split時分到相同的region中,前綴位數可以使用默認的,也可以使用table元數據KeyPrefixRegionSplitPolicy.prefix_length設置。
2.5、DelimitedKeyPrefixRegionSplitPolicy
跟keyPrefixRegionSplitPolicy一樣繼承自IncresingToUpperBoundRegionSplitPolicy,切分條件不變,也是修改了splitKey的選取,會根據指定的分隔符截取rowkey前部分字符,將該部分字符相同的數據在split時分到同一個region,分隔符可以使用table元數據DelimitedKeyPrefixRegionSplitPolicy.delimiter設置。
2.6、DisableSplitPolicy
禁用region自動split。
3、強制split
split 'split_test','0326' //切分split_test表,以0326為切分點