在创建表的时候指定分区的分割点。。
一、命令行形式
1、hbase shell命令行里创建表是使用SPLITS指定一个数组,在数组中指定切割点。
hbase会自动以数据的元素为分割点(分割前会先排序,避免手滑导致顺序颠倒,然后出现分区的startKey大于endKey的情况)。下面数据有四个元素,则会分割出五个region。
create 'staff1','info1','porartition1',SPILTS=>['1000','2000','3000','4000']
分割后的情况如图:
2、把切割点放在本地文件中,然后创建表时指定文件路径。
文件内容:
命令:
create 'staff3','info','partition3',SPLITS_FILE=>'/root/splits.txt'
效果:
有没有发现,文件中的dd与cc顺序颠倒,但分区还是按字典序来?证明了hbase会先排序。
3、以十六进制分割,这个用的很少。。
create 'staff2','info','partition2',{NUMREGIONS=>15,SPLITALGO=>'HexStringSplit'}
效果:
二、java api形式:
就这三种。。
第一行的不会预分区。
第二行就是命令行的指定数组形式。
第三行是指定startKey和endKey,再指定想要分成N个分区。。。。hbase会在startKey和endKey之间自动帮你计算然后分出N个分区
三、合理分区评估:
1、根据服务器数量:
一张表 在一个服务器上最好保持在2~3个region,有3台服务器,那么这张表的region总数保持在6~9个最好。
2、根据将来半年内到一年内的数据量:
一个region数据量不超过10G,避免到达hbase的阈值而自动分区。。。也就是说,如果预估半年到一年这张表的数量会达到100G,那么100/10=10,就需要分10个以上的region。
四、当数据量增长速度不符合预估怎么办,数量比预估多。。。
1、新建一张表,把旧表数据导入到新表。
2、可以使用java api专门指定分割点。