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下面必须没有任何的表,如果有可能会报错,该操作基本上和使用命令行结果一致

以上纯属个人见解,如有问题请联本人!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值