1. HBaseAdmin提供了建表、创建列簇、检查表是否存在、修改表结构和列簇结构、删除表等功能。
2. HBaseAdmin实例的生命周期不宜太长。
3. HBaseAdmin内置了master所用RPC接口代理的封装。HBaseAdmin类提供了以下基本接口:boolean isMasterRunning()检查master是否正在运行;HConnection getConnection()返回连接实例;Configuration getCconfiguration()得到配置实例;close()关闭实例的所用资源,包括与远程服务器的连接。
4. 使用客户端API建表:
public static void creatTable1() throws IOException{
Configuration conf = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor desc = new HTableDescriptor(Bytes.toBytes("testtable1"));
HColumnDescriptor coldef = new HColumnDescriptor(Bytes.toBytes("colfam1"));
desc.addFamily(coldef);
admin.createTable(desc);
//*********检查是否可用**********//
boolean avail = admin.isTableAvailable(Bytes.toBytes("testtable1"));
System.out.println("Table available: "+ avail);
}
5. 通过预分区建表:
public static void creatTable2() throws IOException{
Configuration conf = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor desc = new HTableDescriptor(Bytes.toBytes("testtable2"));
HColumnDescriptor coldef = new HColumnDescriptor(Bytes.toBytes("colfam1"));
desc.addFamily(coldef);
//admin.createTable(desc, startKey, endKey, numRegions);
admin.createTable(desc, Bytes.toBytes(1L), Bytes.toBytes(100L), 10);
printTableRegions("testtable2");
//*********创建表中region的拆分行键***********
byte[][] regions = new byte[][]{
Bytes.toBytes("A"),Bytes.toBytes("D"),
Bytes.toBytes("G"),Bytes.toBytes("K"),
Bytes.toBytes("O"),Bytes.toBytes("T")
};
desc.setName(Bytes.toBytes("testtable3"));
//*****使用新表名和region的已拆分键值列表作为参数传递建表*******
admin.createTable(desc, regions);
printTableRegions("testtable3");
}
6. 第一个region的起始行键与最后一个region的终止行键都是空字节,这是默认规则。前一个region的终止行键与最后一个region的起始行键都是串联起来的——终止行键不包括在前一个region中,而是作为起始行键包含在后一个region中。
7. createTable(HTableDescriptor desc,byte[] startKey,byte[] endKey,intnumRegions) 参数中startKey必须小于endKey,并且numRegions需要大于等于3.此方法中,region的边界是通过终止行键减去起始行键然后除以给定region数量计算得到的。
createTable(HTableDescriptor desc,byte[][] splitKeys),它使用已拆分行键的集合。
8. createTableAsync(HTableDescriptor,byte[][] splitKeys),这个方法使用表描述符和预拆分的region边界作为参数,进行异步建表。表提供了异步和同步两种操作方法。实际上,同步模式仅仅是异步模式的简单封装,增加了不断检查这个任务是否已经完成的循环操作。例如:createTable()方法包装了createTableAsync(),循环检查远程服务器的建表操作是否已经执行完成。
9. 获取所有已建表的表结构:boolean tableExists(),HTableDescriptor[]listTable(),HTableDescriptor getTableDescriptor(byte[] tablename)
public static void displayDesc() throws IOException{
Configuration conf = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor[] htds = admin.listTables();
for(HTableDescriptor htd : htds){
System.out.println(htd);
}
HTableDescriptor htd1 = admin.getTableDescriptor(Bytes.toBytes("testtable2"));
System.out.println(htd1);
HTableDescriptor htd2 = admin.getTableDescriptor(Bytes.toBytes("demo1"));
System.out.println(htd2);
}
10. 删除表:void deleteTable(),一旦表被删除,数据全部删除,在删除表之前用户需要确认这张表是否已经被禁用:disableTable(),disableTableAsync(),用户将表设置为禁用时,regin服务器先将内存中近期还没提交的已修改数据刷写到磁盘中,然后关闭所有的region,并更新这张表的元数据,将所有region标记为下线状态。用户将表设置为禁用时可能花费非常长的时间,这取决于在服务器内存中有多少近期更新的数据还没写到磁盘,将一个region下线会先将内存数据写入到磁盘,如果设置了较大的堆,这将导致region服务器需要写入磁盘的数据较大。
11. 一旦表设置为禁用,但是又不想删除它,可以重新启用该表:viod enableTable(), void enableTableAsync(),这个操作在转移这张表的region到其它服务器时比较有用。检查表的状态:boolean isTableEnable(), Boolean isTableDisabled(), Boolean isTableAvailable()。即使表设置为禁用状态,isTableAvailable()方法也返回true,此方法只对表进行物理检查,不关心表本身的逻辑状态,要获取这张表的可用状态需要使用isTableEnable(),isTableDisable()。
public static void fun() throws IOException{
Configuration conf = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor desc = new HTableDescriptor(Bytes.toBytes("jcdd1"));
HColumnDescriptor coldef = new HColumnDescriptor(Bytes.toBytes("colfam1"));
desc.addFamily(coldef);
admin.createTable(desc);
try {
admin.deleteTable(Bytes.toBytes("jcdd1"));
} catch (IOException e) {
System.out.println("Error deleting table: " +e.getMessage());
}
admin.disableTable(Bytes.toBytes("jcdd1"));
boolean isDisabled = admin.isTableDisabled(Bytes.toBytes("jcdd1"));
System.out.println("Table is disabled: " + isDisabled);
boolean avail1 = admin.isTableAvailable(Bytes.toBytes("jcdd1"));
System.out.println("Table available: " + avail1);
admin.deleteTable(Bytes.toBytes("jcdd1"));
boolean avail2 = admin.isTableAvailable(Bytes.toBytes("jcdd1"));
System.out.println("Table available: " + avail2);
admin.createTable(desc);
boolean isEnable = admin.isTableEnabled(Bytes.toBytes("jcdd1"));
System.out.println("Table is enable: " + isEnable);
}
12. 修改表结构:modifyTable(),也需要先将表设置为禁用状态。modifyTable()方法只提供了异步的操作模式,没提供同步模式,如果用户需要确认修改是否成功,需要在客户端代码中显示循环的调用getTableDescriptor()方法获取元数据,直接与本地实例匹配。
public static void modify() throws IOException{
byte[] name = Bytes.toBytes("jcdd2");
Configuration conf = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor desc = new HTableDescriptor(name);
HColumnDescriptor coldef = new HColumnDescriptor(Bytes.toBytes("colfam1"));
desc.addFamily(coldef);
admin.createTable(desc);
//***获取表结构,增加列簇,并修改文件限制属性********
HTableDescriptor htd1= admin.getTableDescriptor(name);
HColumnDescriptor coldef1 = new HColumnDescriptor(Bytes.toBytes("colfam2"));
htd1.addFamily(coldef1);
htd1.setMaxFileSize(1024*1024*1024l);
//*****禁用表,修改表,启用表*********
admin.disableTable(name);
admin.modifyTable(name, htd1);
admin.enableTable(name);
//*****检查表是否已经被修改成功********
HTableDescriptor htd2 = admin.getTableDescriptor(name);
System.out.println("Equals: " + htd1.equals(htd2));
System.out.println("new schema: "+htd2);
}
13.模式操作:除了modifyTable()方法,HBaseAdmin类还提供了几种表结构修改的方法,首先需要禁用表。相关方法如下:void addColumn() , void deleteColumn() , void modifyColumn(),增加或者修改一个列簇需要先准备一个HColumnDescriptor实例。如果不采用上述方法,只能通过粗粒度地提供常用格式的表名以及列簇名来调用删除操作,但是这些调用都是异步的。