分裂方式有三种:
1.提前分裂,也就是,在创建table的时候就配置好,生成多个region.
提前分裂也分为两种分别是 HexStringSplit 和 UniformSplit 。
如果我们的row key是十六进制的字符串作为前缀的,就比较适合用HexStringSplit,我们使用HexHash(prefix)作为row key的前缀,其中Hexhash为最终得到十六进制字符串的hash算法。我们也可以用我们自己的split算法。
在hbase shell 下:
[mw_shl_code=bash,true]hbase org.apache.hadoop.hbase.util.RegionSplitter pre_split_table HexStringSplit -c 10 -f f1[/mw_shl_code]
-c 10 的意思为,最终的region数目为10个;-f f1为创建一个那么为f1的 column family.
执行scan 'hbase:meta' 可以看到meta表中的10个region
除了提前分裂,还有自动分裂和强制分裂。楼主应该使用的是强制分裂。
其实自动分裂,应该像楼主的只有一个region,可能跟楼主的版本有点关系。
一个region如果是256,达到256M才分裂,这个确实不大好。
在0.94版本之前ConstantSizeRegionSplitPolicy 是默认和唯一的split策略。当某个store(对应一个column family)的大小大于配置值 ‘hbase.hregion.max.filesize’的时候region就会自动分裂。
而0.94版本中,IncreasingToUpperBoundRegionSplitPolicy 是默认的split策略。
这个策略中,最小的分裂大小和table的某个region server的region 个数有关,当store file的大小大于如下公式得出的值的时候就会split,公式如下
Min (R的立方^2 * “hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”) R为同一个table中在同一个region server中region的个数。 例如:
hbase.hregion.memstore.flush.size 默认值 128MB。
hbase.hregion.max.filesize默认值为10GB 。
如果初始时R=1,那么Min(1*1*1*2*128MB,10GB)=128MB,也就是说在第一个flush的时候就会触发分裂操作。
当R=2的时候Min(2*2*2*2*128MB,10GB)=2048MB ,当某个store file大小达到2048MB的时候,就会触发分裂。
如此类推,当R=4的时候,store file 达到10GB的时候就会分裂,也就是说当R>=4的时候,store file 达到10GB的时候就会分裂。
参考:aichengxu
##########################
所以像楼主的256才分裂,可能是因为版本的问题
|