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下面必須沒有任何的表,如果有可能會報錯,該操作基本上和使用命令行結果一致
以上純屬個人見解,如有問題請聯本人!