预分区的目的:增加数据读写效率 负载均衡,防止数据倾斜 方便集群容灾调度 region 优化Map数量
预分区的想法: 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护
第一种 手动分区
create 'user6','info','partition',SPLITS => ['1000','2000','3000','4000']
查看效果:
第二种 十六进制进行分区
create 'user7','info','partition',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
第三种 文件内容分区
create 'user8','partition',SPLITS_FILE => '/opt/a.txt'
文件内容:
aaaaaa
bbbbb
cccccc
效果图:
第四种 java api 分区
public class hbaseSplit {
public void hbaseSplitFunc() throws IOException {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Admin admin = connection.getAdmin();
byte[][] splitKeys = {{5,4,3,2,1},{'a','b','c','d','e'}};
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("user9"));
descriptor.addFamily(new HColumnDescriptor("info"));
descriptor.addFamily(new HColumnDescriptor("info2"));
admin.createTable(descriptor,splitKeys);
}
}