本文是基于Apache版本的2.1.2的HBase开发。
本篇文章是HBase的DDL开发,对HBase的namespace和table的列举,创建,删除
基本规律:
- 构建实例 ==> 2. 构建配置对象 ==> 3.指定服务端地址 ==> 4.构建连接对象 ==> 5.构建管理员(admin对象)
注意:对表的操作,都需要获取 admin, 然后才可以进行相关操作, 其中删除表前需要先禁用表.
新建maven工程,导入依赖
要想使用java操作HBase,需要引入下面依赖
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>2.1.2</version>
</dependency>
代码实现
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import java.util.List;
/**
* TODO 通过Java API来实现DDL操作
* Namespace:列举、创建、删除
* Table:列举、创建、删除
*/
public class HbaseClientDDLTest {
public static void main(String[] args) throws IOException {
//构建实例
HbaseClientDDLTest ddlTest = new HbaseClientDDLTest();
//todo:1-构建连接对象
//构建配置对象,用于管理当前程序的所有配置:用于加载hbase-default和hbase-site文件
Configuration conf = HBaseConfiguration.create();
//在配置中指定服务端地址:Hbase服务端地址:Zookeeper地址,在hbase-site.xml中有配置
conf.set("hbase.zookeeper.quorum", "node1:2181,node2:2181,node3:2181");
//构建连接对象
Connection conn = ConnectionFactory.createConnection(conf);
//todo:2-DDL,必须构建管理员
HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
//todo:3-NS操作:列举、创建、删除
// ddlTest.listNs(admin);
// ddlTest.createNs(admin);
// ddlTest.dropNs(admin);
//todo:4-Table操作:列举、创建、删除
// ddlTest.listTable(admin);
// ddlTest.ceateTable(admin);
// ddlTest.dropTable(admin);
//todo:5-释放资源
admin.close();
conn.close();
}
/**
* 删除表
* @param admin
*/
private void dropTable(HBaseAdmin admin) throws IOException {
TableName tableName = TableName.valueOf("t1");
admin.disableTable(tableName);
admin.deleteTable(tableName);
}
/**
* 创建表
* @param admin
* @throws IOException
*/
private void ceateTable(HBaseAdmin admin) throws IOException {
//定义一个表对象:两个列族,basic【3个版本】和other
TableName tbname = TableName.valueOf("itcast:t1");
//先判断表是否存在,如果已经存在,先删除再创建
if (admin.tableExists(tbname)) {
//先禁用
admin.disableTable(tbname);
//然后删除
admin.deleteTable(tbname);
}
//构建列族的描述器对象
ColumnFamilyDescriptor basic = ColumnFamilyDescriptorBuilder
.newBuilder(Bytes.toBytes("basic"))//指定列族名称
.setMaxVersions(3)//设置最大存储版本数
.build();
ColumnFamilyDescriptor other = ColumnFamilyDescriptorBuilder
.newBuilder(Bytes.toBytes("other"))
.build();
//构建一个表的描述器对象
TableDescriptor desc = TableDescriptorBuilder
.newBuilder(tbname) //指定表的名称
.setColumnFamily(basic)//指定列族
.setColumnFamily(other)//指定列族
.build();
//创建表
admin.createTable(desc);
}
/**
* 列举所有的表
*
* @param admin
* @throws IOException
*/
private void listTable(HBaseAdmin admin) throws IOException {
//调用列举表的方法
List<TableDescriptor> tableDescriptors = admin.listTableDescriptors();
//迭代取出每张表的信息
for (TableDescriptor tableDescriptor : tableDescriptors) {
//打印表名
System.out.println(tableDescriptor.getTableName().getNameAsString());
}
}
/**
* 删除NS
*
* @param admin
*/
private void dropNs(HBaseAdmin admin) throws IOException {
admin.deleteNamespace("bigdata");
}
/**
* 创建NS
*
* @param admin
*/
private void createNs(HBaseAdmin admin) throws IOException {
//创建一个NS的描述器
NamespaceDescriptor descriptor = NamespaceDescriptor
.create("bigdata")//指定NS的名称
.build();
//调用创建的方法
admin.createNamespace(descriptor);
}
/**
* 用于实现列举当前所有的NS
*
* @param admin
*/
private void listNs(HBaseAdmin admin) throws IOException {
//调用列举NS的方法
NamespaceDescriptor[] descriptors = admin.listNamespaceDescriptors();
//迭代取出每个NS的信息,打印名称即可
for (NamespaceDescriptor descriptor : descriptors) {
System.out.println(descriptor.getName());
}
}
}