HBase:使用Java操作HBase(1)之namespace的操作

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.當前操作中出現的問題和分析

  1. 如果一個命名空間不存在,獲取的時候容易出現異常(admin.getNamespaceDescriptor(name))
  2. 只能通過列出所有的namespace方式實現查被查找的namespace是否存在
  3. 通過執行發現這個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下面必須沒有任何的表,如果有可能會報錯,該操作基本上和使用命令行結果一致

以上純屬個人見解,如有問題請聯本人!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章