新建一个maven项目。
在resources路径下创建文件hbase-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop-001,hadoop-002,hadoop-003</value>
</property>
</configuration>
HBaseConnect类,实现连接HBase:
package com.BigData.hbase;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;
public class HBaseConnect {
// 设置静态属性的 HBase 连接 Connection.
// 要点
// 1.为什么是静态?因为Connection的连接是重量级的,不适合经常性的连接和断开。
// 因此使用静态属性,在内存中仅开辟一个内存,使多个进程共用一个Connection,而不是一个进程开一个Connection
public static Connection connection = null;
static {
// 创建 hbase 的连接
try {
// 使用配置文件的方法
connection = ConnectionFactory.createConnection();
} catch (IOException e) {
System.out.println("连接获取失败");
e.printStackTrace();
}
}
/**
* 连接关闭方法,用于进程关闭时调用
* @throws IOException
*/
public static void closeConnection() throws IOException {
if (connection != null) {
connection.close();
}
}
// 测试一下
public static void main(String[] args) {
System.out.println(HBaseConnect.connection);
try {
HBaseConnect.closeConnection();
} catch (IOException e) {
e.printStackTrace();
}
}
}
HBaseDDL类,实现HBase中DDL操作
其中静态方法createNamespace实现创建命名空间
package com.BigData.hbase;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import java.io.IOException;
/**
* 实用程序类HBaseDDL
* 实现DDL操作
*/
public class HBaseDDL {
// 给HBaseConnect.connection 赋值引用(这里的静态属性connection是引用,指向HBaseConnect类中的connect对象)
// connection 指向单例连接(伪单例模式)
public static Connection connection = HBaseConnect.connection;
/**
* 参加命名空间
* @param namespace_name 命名空间名称
*/
public static void createNamespace(String namespace_name) throws IOException {
// step1. 建立HBase连接,同时获取DDL操作权限:
// Admin类管理DDL语言,Table类管理DML语言
// 这里有异常IOException,但是这个异常不归这个类(HBaesDDL)管。这个类只负责DDL操作咯!
// 把异常抛出去吧,但是先别抛,等所有代码写完再抛,看看后面代码还有没有这个异常。
Admin admin = connection.getAdmin();
// step2.创建一个‘命名空间描述’的建造者(builder)
// 想要实例化一个NamespaceDescriptor 就要调用他的静态方法(内部类Builder)?——(建造者模式)
NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace_name);
// step3.给建造者builder提需求
// 可以向建造者多提点需求,当然也可以不提
builder.addConfiguration("user","APPLE");
// step4.使用建造者builder 建造(build)一个‘命名空间描述’
NamespaceDescriptor namespaceDescriptor = builder.build();
// step5.传入‘命名空间描述’,建立一个命名空间
try {
admin.createNamespace(namespaceDescriptor);
} catch (IOException e) {
System.out.println("命名空间已经存在");
e.printStackTrace();
}
// 这个IO异常也抛出!
admin.close();
}
// 测试一下,因为Connection的连接是重量级的,所以代码运行可能需要花上点时间,可以等等几分钟
public static void main(String[] args) throws IOException {
System.out.println("正在创建...|");
HBaseDDL.createNamespace("AKKKKK");
System.out.println("其他代码");
HBaseConnect.closeConnection();
}
}
上述代码中有几个要点:
1.admin.createNamespace()中的参数是一个NamespaceDescriptor()(命名空间描述)
2.为什么参数不直接为命名空间的名字呢?因为相比shell,代码更加底层要实现更多功能因此要传入一个”命名空间描述“对象
3.但是为什么传入new NamespaceDescriptor()又报错了呢? 因为NamespaceDescriptor对象构造函数是私有的(private)
admin.createNamespace(new NamespaceDescriptor()); // 这里会报错
4.因此我们要通过静态方法Builder.build()来得到NamespaceDescriptor对象