设为首页 加入收藏

TOP

HBase创建命名空间的API操作,抛异常的坑(源码解析)
2019-05-02 01:44:29 】 浏览:52
Tags:HBase 创建 命名 空间 API 操作 异常 源码 解析
版权声明:本文为博主原创文章,如需转载,请注明出处 。 https://blog.csdn.net/wx1528159409/article/details/85266856

HBase创建命名空间时,原本用的以下代码

public abstract class BaseDao{
    //创建命名空间,如果命名空间不存在,则创建新的,否则不做任何操作
    protected void createNamespaceNX(String nameSpace) throws IOException {
        //创建默认配置对象
        Configuration conf = HBaseConfiguration.create();
        //获取连接对象
        Connection connection = ConnectionFactory.createConnection(conf);
        //获取管理对象
        Admin admin = connection.getAdmin();
        //获取命名空间
        NamespaceDescriptor namespaceDescriptor = admin.getNamespaceDescriptor(nameSpace);
        if(namespaceDescriptor == null){
            //创建命名空间的描述器
            namespaceDescriptor = NamespaceDescriptor.create(nameSpace).build();
            //管理对象创建命名空间
            admin.createNamespace(namespaceDescriptor);
        }
}

按照预想的逻辑,当namespaceDescriptor == null时,直接创建命名空间;

但是实际跑程序时,若命名空间不存在,会直接抛异常


于是看了一下,getNamespaceDescriptor()方法的源码,如下

  NamespaceDescriptor getNamespaceDescriptor(final String name)
      throws NamespaceNotFoundException, IOException;

发现创建命名空间时,若命名空间不存在,需要用这个特定NamespaceNotFoundException进行抛异常;于是改进代码

小结:

对特殊异常需要处理时,用try catch的方式,单独捕捉异常并处理,

否则一律通过throw exception这种形式进行直接抛出,抛到框架最外层,由框架统一处理。


创建命名空间的正确代码如下:

 public abstract class BaseDao{
    //创建命名空间,如果命名空间不存在,则创建新的,否则不做任何操作
    protected void createNamespaceNX(String nameSpace) throws IOException {
        //创建默认配置对象
        Configuration conf = HBaseConfiguration.create();
        //获取连接对象
        Connection connection = ConnectionFactory.createConnection(conf);
        //获取管理对象
        Admin admin = connection.getAdmin();    

//以下是正确代码:
        try{
            admin.getNamespaceDescriptor(nameSpace);
        }catch(NamespaceNotFoundException e){
            //若发生特定的异常,即找不到命名空间,则创建命名空间
            NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(nameSpace).build();
            admin.createNamespace(namespaceDescriptor);
        }
    }

这样,在HBase中创建命名空间时,就不会因为命名空间不存在而抛异常了;

当命名空间存在时,直接get调用;当命名空间不存在时,进行create创建。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇hbase利用hint来实现filter快速扫.. 下一篇Hbase的高可用架构分析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目