注:需要配置Maven,并设置相关配置导入HBase的包
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
1、尝试连接上虚拟机中的HBase
用能否判断HBase中损是否有这个表来判断能否连接上HBase
这里介绍两种连接方式,一种是旧版的(被淘汰的),一种是新版的
旧版:
//旧版:判断表是否存在
public static boolean old_TableExist(String tableName) throws IOException {
//1、获取配置文件对象
HBaseConfiguration configuration = new HBaseConfiguration();
//相应配置文件信息
configuration.set("hbase.zookeeper.quorum","hadoop100");
//2、获取管理员对象
HBaseAdmin admin = new HBaseAdmin(configuration);
//3、判断表是否存在
boolean exists = admin.tableExists(tableName);
//4、关闭连接
admin.close();
return exists;
}
因为是要对表进行操作,所以是admin对象,旧版虽然也可以对表进行操作,但很多方法已经过时
新版:
//新版:判断表是否存在
public static boolean new_TableExist(String tablename) throws IOException {
//1、获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
//相应配置文件信息
configuration.set("hbase.zookeeper.quorum","hadoop100");
//2、获取管理员对象
Connection connection = ConnectionFactory.createConnection(configuration);
Admin admin = connection.getAdmin();
//3、判断表是否存在
boolean exists = admin.tableExists(TableName.valueOf(tablename));
//4、关闭连接
admin.close();
return exists;
}
和旧表不一样的地方在于:
①configuration是通过HBaseConfiguration的create方法得到的;
②先获取connectio对象,在通过connection对象get到admin对象;
③传入tablename是要TableName类型的,而不是像旧版一样是用String、类型即可的。
在这里我们发现一个问题,我们每次操作都需要获取配置信息和关闭资源,这样会造成很大的资源浪费,能不能将获取配置信息和关闭资源分别集成起来统一操作呢?
规范:
public class CreateTable {
private static Connection connection = null;
private static Admin admin = null;
static {
try {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum","hadoop100");
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void close(){
if (admin != null){
try {
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static boolean TableExist(String tableName) throws IOException {
boolean exists = admin.tableExists(TableName.valueOf(tableName));
return exists;
}
public static void main(String[] args) throws IOException {
System.out.println(old_TableExist("aaaaa"));
System.out.println(TableExist("stu"));
close();
}
}
通过设置静态代码块,使每次初始化前都将需要的配置完成。然后设置一个统一关闭资源的方法close,使用完成之后关闭资源。
操作结果:
2、创建表操作
//创建表,可传多个参数
public static void create(String tableName, String... cfs) throws IOException {
//1、判断是否有列族信息
if (cfs.length == 0){
System.out.println("请设置列族信息!!");
return;
}
//2、判断表是否已存在
if (TableExist(tableName)){
System.out.println("该表已存在!!");
return;
}
//3、创建表描述器
HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
//4、循环添加列族信息
for (String cf : cfs){
//5、创建列族描述器
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
//设置最大版本数
hColumnDescriptor.setMaxVersions(3);
//6、添加列族信息
hTableDescriptor.addFamily(hColumnDescriptor);
}
//7、创建表
admin.createTable(hTableDescriptor);
}
创建表操作要注意的是:要创建表需要一个表描述器,要添加列族需要列族描述器
测试:
public static void main(String[] args) throws IOException {
System.out.println(TableExist("stu2"));
create("stu2", "info1","info2");
System.out.println(TableExist("stu2"));
close();
}
结果:
说明表创建成功!
3、删除表操作
public static void DropTable(String tableName) throws IOException {
//1、判断表是否存在
if (!TableExist(tableName)) {
System.out.println(tableName + "表不存在!!");
return;
}
//2、先使表下线
admin.disableTable(TableName.valueOf(tableName));
//3、删除表
admin.deleteTable(TableName.valueOf(tableName));
}
这里要注意的是要先用之前写的判断表是否存在来筛选一遍,还有就是删除表前要先用disable使表下线
测试:
public static void main(String[] args) throws IOException {
System.out.println(TableExist("stu2"));
DropTable("stu2");
System.out.println(TableExist("stu2"));
}
结果:
删除成功!
4、创建命名空间
public static void CreateNameSpace(String ns){
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(ns).build();
try {
admin.createNamespace(namespaceDescriptor);
}catch (NamespaceExistException e){
System.out.println(ns + "命名空间已存在!");
}
catch (IOException e) {
e.printStackTrace();
}
}
这里有两点
①admin创建namespace需要namespaceDescriptor对象,而NamespaceDescriptor的构造器是私有的(private)
所以要构造NamespaceDescriptor需要通过内部类Builder中的build创建
但build对象的构造器也是私有的,所以要通过NamespaceDescriptor的一个静态方法create来创建Build对象
②就是为什么要使用NamespaceExistException异常,这个我们测试完再给大家分析:
测试:
public static void main(String[] args) {
CreateNameSpace("1801");
}
结果(运行一次):
可以看到已经创建成功了
再次运行,报异常打印的错误,说明NamespaceExistException是用来判断命名空间是否存在的。