天天看点

HBASE通过预先创建regions,来平衡数据的负载

HBase中的表默认是创建一个region,所以大部分写入的时候,所有的客户端都会写到一个region中直到region达到设定值进行分裂split,然后通过集群进行分发。所以有一个很有用的方法来提高大数据写入过程的效率就是预先创建regions。

public static boolean createTable(HBaseAdmin admin, HTableDescriptor table, byte[][] splits)

throws IOException {

  try {

    admin.createTable( table, splits );

    return true;

  } catch (TableExistsException e) {

    logger.info("table " + table.getNameAsString() + " already exists");

    // the table already exists...

    return false;  

  }

}

public static byte[][] getHexSplits(String startKey, String endKey, int numRegions) {

  byte[][] splits = new byte[numRegions-1][];

  BigInteger lowestKey = new BigInteger(startKey, 16);

  BigInteger highestKey = new BigInteger(endKey, 16);

  BigInteger range = highestKey.subtract(lowestKey);

  BigInteger regionIncrement = range.divide(BigInteger.valueOf(numRegions));

  lowestKey = lowestKey.add(regionIncrement);

  for(int i=0; i < numRegions-1;i++) {

    BigInteger key = lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i)));

    byte[] b = String.format("%016x", key).getBytes();

    splits[i] = b;

  }

  return splits;

}