1.声明
当前内容主要用于本人学习和复习,当前的内容主要为使用java方式操作HBase中的namespace
当前的操作基于前面的博文:开放HBase让java可以访问
2.开始操作
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
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.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
/**
* @description 基本的HBase操作创建表,创建命名空间,为命名空间设置配置属性,禁用表,删除表,删除命名空间,列出所有的命名空间,列出指定命名空间下的表
* @author hy
* @date 2020-06-15
*/
public class NamespaceOptionTest {
private static String optionNamespace = "test";
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.1.107:2181");
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin = conn.getAdmin();
// 1.查看所有的namespace
NamespaceDescriptor[] listNamespaceDescriptors = admin.listNamespaceDescriptors();
System.out.println(Arrays.toString(listNamespaceDescriptors));
boolean exists=false;
for (NamespaceDescriptor namespaceDescriptor : listNamespaceDescriptors) {
if(namespaceDescriptor.getName().equals(optionNamespace)) {
exists=true;
break;
}
}
// 2. 查看指定的namespace
NamespaceDescriptor namespaceDescriptor = null;
if (!exists) {
System.out.println("当前的namespace:" + optionNamespace + ",不存在");
// 创建namespace
namespaceDescriptor = NamespaceDescriptor.create(optionNamespace).build();
admin.createNamespace(namespaceDescriptor);
System.out.println("创建namspace:" + optionNamespace + ",成功!");
}
// 3.再次查看数据
listNamespaceDescriptors = admin.listNamespaceDescriptors();
System.out.println(Arrays.toString(listNamespaceDescriptors));
// 4.修改namespace的配置属性
namespaceDescriptor.setConfiguration("PROPERTY_NAME", "PROPERTY_VALUE");
admin.modifyNamespace(namespaceDescriptor);
// 5. 查看该namesapce的详情
namespaceDescriptor = admin.getNamespaceDescriptor(optionNamespace);
System.out.println("查看namespace的详情===>" + namespaceDescriptor);
// 6.创建表并声明命名空间
ColumnFamilyDescriptor familyDescriptor = ColumnFamilyDescriptorBuilder.of("cf");
TableName test = TableName.valueOf("test");
TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(test).addColumnFamily(familyDescriptor).build();
admin.createTable(tableDescriptor);
System.out.println("创建test表成功====>");
// 7.列出default命名空间的表
List<TableDescriptor> tablesDesc = admin.listTableDescriptorsByNamespace("default".getBytes());
System.out.println("当前default命名空间下的表有:"+tablesDesc);
// 8.禁用表test
admin.disableTable(test);
System.out.println("禁用表test");
// 9.删除表test
admin.deleteTable(test);
System.out.println("删除表test");
// 10.删除命名空间
admin.deleteNamespace(optionNamespace);
System.out.println("删除命名空间成功===>");
listNamespaceDescriptors = admin.listNamespaceDescriptors();
System.out.println(Arrays.toString(listNamespaceDescriptors));
admin.close();
conn.close();
}
}
执行结果
执行成功
3.当前操作中出现的问题和分析
- 如果一个命名空间不存在,获取的时候容易出现异常
(admin.getNamespaceDescriptor(name))
- 只能通过列出所有的namespace方式实现查被查找的namespace是否存在
- 通过执行发现这个Admin是用来执行创建和执行各种管理员操作(创建表创建命名空间,删除表,删除命名空间等操作的)
4.封装一般的HBase的操作到工具类中
import java.io.IOException;
import java.util.List;
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.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
/**
* @description 当前HBase的工具类,主要用于简化操作
* @author hy
* @date 2020-06-15
*/
public class HBaseUtils {
final Configuration conf;
private Admin admin;
private Connection conn;
public HBaseUtils(Configuration conf) {
this.conf = conf;
init();
}
private void init() {
try {
getConnection();
getAdmin();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public HBaseUtils(String zkQuorum) {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", zkQuorum);
this.conf = conf;
init();
}
public synchronized Connection getConnection() throws IOException {
if (conn != null) {
return conn;
}
return conn = ConnectionFactory.createConnection(conf);
}
public synchronized Admin getAdmin() throws IOException {
if (admin != null) {
return admin;
}
return admin = getConnection().getAdmin();
}
/*** namespace的操作 ***/
public NamespaceDescriptor[] listNamespace() throws IOException {
NamespaceDescriptor[] list = getAdmin().listNamespaceDescriptors();
return list;
}
public List<TableDescriptor> listTableDescriptorsByNamespace(String namespace) throws IOException {
return getAdmin().listTableDescriptorsByNamespace(namespace.getBytes());
}
public boolean existsNamespace(String namespace) throws IOException {
for (NamespaceDescriptor namespaceDescriptor : listNamespace()) {
if (namespaceDescriptor.getName().equals(namespace)) {
return true;
}
}
return false;
}
public NamespaceDescriptor getNamespace(String namespace) throws IOException {
if (existsNamespace(namespace)) {
return getAdmin().getNamespaceDescriptor(namespace);
}
return null;
}
public NamespaceDescriptor createNamespace(String namespace) throws IOException {
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(namespace).build();
getAdmin().createNamespace(namespaceDescriptor);
return namespaceDescriptor;
}
public boolean deleteNamespace(String namespace) throws IOException {
getAdmin().deleteNamespace(namespace);
return true;
}
public void modifyNamespaceConfig(NamespaceDescriptor namespaceDescriptor, String key, String value)
throws IOException {
namespaceDescriptor.setConfiguration("PROPERTY_NAME", "PROPERTY_VALUE");
getAdmin().modifyNamespace(namespaceDescriptor);
}
/*** table的操作 ***/
public void createTable(String tableName, String... columnFamilies) throws IOException {
TableName t = TableName.valueOf(tableName);
TableDescriptorBuilder build = TableDescriptorBuilder.newBuilder(t);
for (String columnFamily : columnFamilies) {
ColumnFamilyDescriptor familyDescriptor = ColumnFamilyDescriptorBuilder.of(columnFamily);
build.setColumnFamily(familyDescriptor);
}
TableDescriptor tableDescriptor = build.build();
getAdmin().createTable(tableDescriptor);
}
public TableName[] listTableNames() throws IOException {
return getAdmin().listTableNames();
}
public TableName tableName(String tableName) {
return TableName.valueOf(tableName);
}
public boolean exitstTable(String tableName) throws IOException {
return getAdmin().tableExists(tableName(tableName));
}
public void disableTable(String tableName) throws IOException {
getAdmin().disableTable(tableName(tableName));
}
public boolean isTableDisabled(String tableName) throws IOException {
return getAdmin().isTableDisabled(tableName(tableName));
}
public boolean deleteTable(String tableName) throws IOException {
if (!exitstTable(tableName)) {
return false;
}
if (!isTableDisabled(tableName)) {
disableTable(tableName);
}
getAdmin().deleteTable(TableName.valueOf(tableName));
return true;
}
public void close() throws IOException {
close(getAdmin());
close(getConnection());
}
private void close(Admin admin) {
try {
if (admin != null) {
admin.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void close(Connection conn) {
try {
if (conn != null) {
conn.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
此时的java操作
public class NamespaceOptionTest {
private static String optionNamespace = "test";
public static void main(String[] args) throws IOException {
HBaseUtils hbaseUtils = new HBaseUtils("192.168.1.107:2181");
// 1.查看所有的namespace
NamespaceDescriptor[] listNamespaceDescriptors = hbaseUtils.listNamespace();
System.out.println(Arrays.toString(listNamespaceDescriptors));
// 2. 查看指定的namespace
NamespaceDescriptor namespaceDescriptor = null;
if (!hbaseUtils.existsNamespace(optionNamespace)) {
System.out.println("当前的namespace:" + optionNamespace + ",不存在");
// 创建namespace
namespaceDescriptor = hbaseUtils.createNamespace(optionNamespace);
System.out.println("创建namspace:" + optionNamespace + ",成功!");
}
// 3.再次查看数据
listNamespaceDescriptors = hbaseUtils.listNamespace();
System.out.println(Arrays.toString(listNamespaceDescriptors));
// 4.修改namespace的配置属性
hbaseUtils.modifyNamespaceConfig(namespaceDescriptor, "PROPERTY_NAME", "PROPERTY_VALUE");
// 5. 查看该namesapce的详情
namespaceDescriptor = hbaseUtils.getNamespace(optionNamespace);
System.out.println("查看namespace的详情===>" + namespaceDescriptor);
// 6.创建表并声明命名空间
String tableName = "test";
hbaseUtils.createTable(tableName, "cf");
System.out.println("创建test表成功====>");
// 7.列出default命名空间的表
List<TableDescriptor> tablesDesc = hbaseUtils.listTableDescriptorsByNamespace("default");
System.out.println("当前default命名空间下的表有:" + tablesDesc);
// 8.禁用表test
hbaseUtils.disableTable(tableName);
System.out.println("禁用表test");
// 9.删除表test
hbaseUtils.deleteTable(tableName);
System.out.println("删除表test");
// 10.删除命名空间
hbaseUtils.deleteNamespace(optionNamespace);
System.out.println("删除命名空间成功===>");
listNamespaceDescriptors = hbaseUtils.listNamespace();
System.out.println(Arrays.toString(listNamespaceDescriptors));
hbaseUtils.close();
}
结果和上面一致
5.总结
1.主要通过ConnectionFactory并使用Configuration创建连接,其他的操作主要使用Admin
2.删除namespace时,该namespace下面必须没有任何的表,如果有可能会报错,该操作基本上和使用命令行结果一致
以上纯属个人见解,如有问题请联本人!