客户端提供了 API的模式来管理集群,与 RDBMS中的DDL相比—— 客户端提供的具
有管理功能的API更像是DML。
HBaseAdmin提供了建表、创建列族、检查表是否存在、修改表结构和列族结构和删除表等功能
使用管理的API需实例化HBaseAdmin类,构造函数如下:
HBaseAdmin(Configuration conf) throws MasterNotRunningException,ZooKeeperConnectionException
管理功能API中大多数方法都抛出IOException (或继承自它的异常),或者是InterruptedException。前者是客户端与服 务器端的通信异常,后者是执行过程中的干扰异常,例如,region服务器的执行命令在完成前被停止所引起的问题。已有的配置实例提供了足够的配置信息,所以当前的API可以通过使用ZooKeeper的相关配置信息查找集群,类似于普通客户端API的使用方法。具有管理功能的API实例应该在使用后进行销毁,HBaseAdmin实例的生命周期不宜太长
//这个类实现了 Abortable接口,并实现了以下方法:
void abort(String why,Throwable e)
以上方法被框架隐式调用,例如,当发生致命连接错误或关闭集群时。用户不能直接
调用这个方法,但是在紧急的情况下,例如需要完整的关机或重启时,系统会调用该
方法。
//以下方法可以获得master的远程对象:
HMasterlnterface getMaster() throws MasterNotRunningException,ZooKeeperConnectionException
上面的方法会返回HMasterlnterface接口的RPC代理实例,允许用户直接通过这个实例访问master服务器。不过这个方法不是必须的,HBaseAdmin内置了 master所有RPC 接口代理的封装
HBaseAdmin类还提供了以下基本接口
boolean isMasterRunning()
通过这个接口检查master是否正在运行。用户也可以通过客户端程序在实例化 HBaseAdmin类之前直接调用该接口确认其可以与master通信
HConnection getConnection()
返回连接实例
Configuration getC onfiguration()
访问创建HBaseAdmin实例时使用到的配置实例,可以通过修改这个实例中的 变量达到改变HBaseAdmin API调用时依赖的配置的目的
close ()
关闭HBaseAdmin实例的所有资源,包括与远程服务器的连接
这些操作可以达到帮助表工作的目的,而非实际的内部模式
建
//建表的相关方法
void createTable(HTableDescriptor desc)
void createTable(HTableDescriptor desc,byte[] startKey, byte[] endKey,int numRegions)
void createTable(HTableDescriptor desc,byte[][] splitKeys)
void createTableAsync(HTableDescriptor desc,byte[][] splitKeys)
描述的方法都使用到了 HTableDescriptor实例
//使用客户端API建表
Configuration conf = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(conf); //创建实例
HTableDescriptor desc = new HTableDescriptor( Bytes.toBytes("testtable"));//创建表描述符
HColumnDescriptor coldef = new HColumnDescriptor( Bytes.toBytes("coifamiH )); desc.addFamily(coldef); //添加列族描述符到表描述符中
admin.createTable(desc); //建表
boolean avail = admin.isTableAvailable(Bytes.toBytes("testtable")); //检查表是否可用
System.out.println ("Table available: " + avail);
//通过预分区方式建表
以上使用了 HTable类getStartEndKeys获取所有 region的边界。 第一个 region的起始行键与最后一个region的终止行键都是空字节,起始和终止行键都是已经计算好的,或是提供给用户的拆分键。 需要注意的是,前一个region的终止行键与后一个region的起始行键是串联起来 的—-终止行键不包含在前一个region中,而是作为起始行键包含在后一个region 中
createTable(HTableDescriptor desc,byte[] startKey,byte[] endKey,int numRegions)方法能够以特定数量拆分特定起始行键和特定终止行键,并创建表
createTable (HTableDescriptor desczbyte [] [] splitKeys)它使用已拆分行键的集合:使用了已经拆分好的region边界列表,因此 结果都是与预期相符的。
createTableAsync (HTableDescriptor desc,byte [] [] splitKeys)方法,这个方法使用表描述符和预拆分的region边界作为参数,并进行异步建表,但执行过程与
createTable ()方法殊途同归
表的大多数管理功能都是异步的,这对发送命令而不需要等待执行结果
的场景是非常有用的,表提供了异步与同步两种操作模式。实际上,同步模式仅仅是异步模式的简单封装,增加了不断检查这个任务是否已经完成的循环操作
获取表描述符
boolean tableExists(String tableName)
boolean tableExists(byte[] tableName)
HTableDescriptor[] listTables()
HTableDescriptor getTableDescriptor(byte[] tableName)
//获取所有已建表的表结构
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor[] htds = admin.listTables();
for(HTableDescriptor htd : htds){
System.out.println(htd);
HTableDescriptor htdl = admin.getTableDescriptor(
Bytes.toBytes("testtablel")
);
System.out.println(htdl);
HTableDescriptor htd2 = admin.getTableDescriptor(Bytes.toBytes("testtablelO"));
System.out.println(htd2);
//如果用户试图访问一个不存在的表描述符,就会得到对应的异常,因此用户在访问这个API的时候,必须使用已存在的表的表名,或者对上述的代码使用try/catch封装来处理这些异常
删除
void deleteTable(String tableName)
void deleteTable(byte[] tableName)
一旦表被删除,所有的数据都会被删除。
在删除表之前,用户需要确认这张表是否已经被禁用(disabled),可通过如下方法设置该参数:
void disableTable(String tableName)
void disableTable(byte[] tableName)
void disableTableAsync(String tableName)
void disableTableAsync(byte[] tableName)
用户将表设置为禁用时,region服务器会先将内存中近期内还未提交的已修改数据刷写 到磁盘中,然后关闭所有的region,并更新这张表的元数据,将所有region标记为下线状态。
一旦表被设置为禁用,但用户并不想删除它,可以通过以下方式重新启用该表。
void enableTable(String tableName)
void enableTable(byte[] tableName)
void enableTableAsync(String tableName)
void enableTableAsync(byte[] tableName)
这个操作在转移这张表的region到其他可用服务器时比较有用。此外,以下是检查 表的状态的一组方法:
boolean isTableEnabled(String tableName)
boolean isTableEnabled(byte[] tableName)
boolean isTableDisabled(String tableName)
boolean isTableDisabled(byte[] tableName)
boolean isTableAvailable(byte[] tableName)
boolean isTableAvailable(String tableName)
集合了建表、删表、禁用表以及检查表状态等操作
HTableDescriptor desc = new HTableDescriptor( Bytes.toBytes("testtable"));
HColumnDescriptor coldef = new HColumnDescriptor( Bytes.toBytes("coifami"));
desc.addFamily(coldef); admin.createTable(desc);
try {
admin.deleteTable(Bytes.toBytes("testtable")); }
catch(IOException e){
System.err.println("Error deleting table: " + e.getMessage()
};
admin.disableTable(Bytes.toBytes("testtable"));
boolean isDisabled = admin.isTableDisabled(Bytes.toBytes("testtable"));
System.out.println("Table is disabled: " + isDisabled);
boolean availl = admin.isTableAvailable(Bytes.toBytes("testtable"));
System.out.println ("Table available: ’’ + availl);
admin.deleteTable(Bytes.toBytes("testtable"));
boolean avail2 = admin.isTableAvailable(Bytes.toBytes("testtable"));
System.out.println("Table available: " + avail2);
admin.createTable(desc);
boolean isEnabled = admin.isTableEnabled(Bytes.toBytes ("testtable"));
System.out.println("Table is enabled: " + isEnabled);
用户建表后,如果需要修改表结构必须删除表结构然后重建表,或采用如下方法改变表结构:
void modifyTable(byte[] tableName,HTableDescriptor htd)
与前面提到的deleteTable操作类似,用户要先将表设置为禁用状态才能修改表结构
byte[] name = Bytes.toBytes("testtable");
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor desc = new HTableDescriptor(name);
HColumnDescriptor coldefl = new HColumnDescriptor( Bytes.toBytes("coifami"));
desc.addFamily(coldefl);
admin.createTable(desc);
HTableDescriptor htdl = admin.getTableDescriptor(name);
HColumnDescriptor coldef2 = new HColumnDescriptor( Bytes.toBytes("coifam2 ”));
htdl.addFamily(coldef2); htdl.setMaxFileSize(1024 * 1024 * 1024L);
admin.disableTable(name);
admin. modifyTable (name, htdl);
admin.enableTable(name);
HTableDescriptor htd2 = admin.getTableDescriptor(name);
System.out.println("Equals: " + htdl.equals(htd2));
System, out. println ("New schema: ’’ + htd2 );
调用 HTableDescriptor对象的equals ()方法比较客户端本地的实例与从元数据获取的 实例是否一致(包括所有列族以及与它们相关的设置)。
modifyTable ()方法只提供了异步的操作模式,没有提供同步的操作模式。如果用户需要确认修改是否已经成功,需要在客户端代码中显式循环地调用 getTableDescriptor ()方法获取元数据,直到结果与本地 实例匹配
集群管理(5.2.4)
HBaseAdmin类允许用户查看集群状态,执行表级任务和管理rehion
集群状态信息(5.2.5)