前言:默认情况下, HBase创建表时候会自动创建一个region,当插入数据的时候, 数据到会写到这一个region, 直到这个region足够大了才进行切分(split)。一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。
1、创建分区
/**
* 60/2 30个分区 2分钟一个
* 为什么创建的splitkeys 少一个。
* 因为使用createTable(HTableDescriptor desc, byte[][] splitKeys) 创建预分区的table,
* regions的数目等于splitkeys+1
* @see org.apache.hadoop.hbase.client.HBaseAdmin.createTable(HTableDescriptor desc, byte[][] splitKeys)
* Creates a new table with an initial set of empty regions defined by the specified split keys.
* The total number of regions created will be the number of split keys plus one. Synchronous operation.
* Note : Avoid passing empty split key.
* @return byte[][] splitkeys
*/
public static byte[][] getSplit() {
byte[][] splits = new byte[29][];
for (int i = 1; i < 30; i ++) {
int vi = i * 2;
String si = (vi < 10) ? ("0" + vi) : "" + vi;//补成两位
splits[i - 1] = si.getBytes();
}
return splits;
}
2、创建预分区表
//Admin有创建分区表方法
void org.apache.hadoop.hbase.client.HBaseAdmin.createTable(HTableDescriptor htd, byte[][] splits) throws IOException
创建表
/**
* hbase创建表
* @param tableName 表名
* @param cf 列族
* @param split pre-creating region 表的设计优化, 预创建多个region,避免写数据到一个region上导致读写热点
* 默认情况下,在创建HBase表的时候会自动创建一个region分区,
* 当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分
*
*/
public static void create(String tableName, String cf, byte[][] split){
//创建表管理
HBaseAdmin admin = null;
try {
Configuration conf = HBaseConfiguration.create();
admin = new HBaseAdmin(conf);
} catch (Exception e) {
e.printStackTrace();
}
HTableDescriptor htd = new HTableDescriptor(tableName);
HColumnDescriptor hcd = new HColumnDescriptor(cf);
hcd.setInMemory(true);
//设置表中数据的存储生命期,过期数据将自动被删除,例如如果只需要存储最近两天的数据,那么可以设置setTimeToLive(2 * 24 * 60 * 60)。
//hcd.setTimeToLive(timeToLive)//设置生命周期
hcd.setMaxVersions(2); //设置版本数
htd.addFamily(hcd);
//如果表不存在,创建表
try {
if(split != null){
if(!admin.tableExists(htd.getName())){
admin.createTable(htd, split);
}
}else {//默认情况。不预创建region
admin.createTable(htd);
}
} catch (IOException e) {
e.printStackTrace();
}
}