package hbaseapi; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.TreeSet; /** * 尝试将表改为绝对均衡(修改key值前面的两个数字为有序数字而不是随机数) */ public class absBalance{ public static Configuration conf; static Connection connection = null; static HBaseAdmin admin = null; static { try { conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "bigdata166"); conf.set("hbase.zookeeper.property.clientport", "2181"); connection = ConnectionFactory.createConnection(conf); admin = (HBaseAdmin) connection.getAdmin(); } catch (IOException e) { e.printStackTrace(); } } /** * 分区键 * * @param regions region个数 * @return splitKeys */ private static byte[][] genSplitKeys(int regions) { //第一步:生成分区键 String[] keys = new String[regions]; //格式化分区键的形式 00 01 02 DecimalFormat df = new DecimalFormat("00"); for (int i = 0; i < regions; i++) { keys[i] = df.format(i*10) + ""; } //第二步:分区键排序 //排序 保证你这个分区键是有序得 TreeSet<byte[]> treeSet = new TreeSet<>(Bytes.BYTES_COMPARATOR); for (int i = 0; i < regions; i++) { treeSet.add(Bytes.toBytes(keys[i])); } //第三步:迭代输出 byte[][] splitKeys = new byte[regions][]; Iterator<byte[]> iterator = treeSet.iterator(); int index = 0; while (iterator.hasNext()) { byte[] next = iterator.next(); splitKeys[index++] = next; } return splitKeys; } public static boolean isTableExist(String tableName) throws IOException { return admin.tableExists(tableName); } /** * (判断表)创建表 * * @param tableName 表名 * @param columnFamily 列族<=3 多个 可变 */ public static void createRegionsTable(String tableName, int regions, String... columnFamily) throws Exception { if (isTableExist(tableName)) { System.out.println("表已存在"); } else { //通过表描述器 HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(tableName)); //循环创建列族 for (String cf : columnFamily) { HColumnDescriptor hcd = new HColumnDescriptor(cf); descriptor.addFamily(hcd); } admin.createTable(descriptor, genSplitKeys(regions)); // 根据二维数组创建region System.out.println("表创建成功"); } } private static String getRandomNumber() { return (Math.random() + "").substring(2, 4); } private static List<Put> batchPut() { List<Put> list = new ArrayList<Put>(); for (int i = 1; i <= 100000; i++) { String frs = Math.ceil((double) i/1000)+""; byte[] rowkey = Bytes.toBytes(frs + "-" + System.currentTimeMillis() + "-" + i); Put put = new Put(rowkey); put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("name"), Bytes.toBytes("andy" + i)); list.add(put); } return list; } /** * 获取此row在哪一个region上 * * @param tableName * @param row * @throws IOException */ private static void getRegionLocation(String tableName, byte[] row) throws IOException { RegionLocator location = connection.getRegionLocator(TableName.valueOf(tableName)); HRegionInfo rg = location.getRegionLocation(row).getRegionInfo(); String regionname = Bytes.toString(rg.getRegionName()); String strkey = Bytes.toString(rg.getStartKey()); String endkey = Bytes.toString(rg.getEndKey()); System.out.println(regionname); System.out.println(strkey); System.out.println(endkey); } public static void main(String[] args) throws Exception { //////////////////////////////////////////////////////测试代码///////////////////////////////////////////// byte[][] test = genSplitKeys(10); for (byte[] bytes : test) { System.out.println(Bytes.toString(bytes)); } //getRow("student", "1001"); // getRowQualifier("student", "1001", "cf1", "sex"); // initNameSpace("ccc"); // dropTable("cndy"); createRegionsTable("fndy", 10, "cf1"); Table table = connection.getTable(TableName.valueOf("fndy")); table.put(batchPut()); // 自动将数据均匀存储到里面 //genSplitKeys(6); // getRegionLocation("cndy", Bytes.toBytes("75-1649578056056-90350")); // getRegionLocation("cndy", Bytes.toBytes("97-xxx")); // getRegionLocation("cndy", Bytes.toBytes("97-999")); // getRegionLocation("cndy", Bytes.toBytes("97-777")); // getRegionLocation("cndy", Bytes.toBytes("44-777")); // getRegionLocation("cndy", Bytes.toBytes("44***777")); // getRegionLocation("cndy", Bytes.toBytes("s4***777")); // getRegionLocation("cndy", Bytes.toBytes("24***777")); } }