hbase中托管和非托管hconnection有什么区别?

时间:2016-04-22 02:05:20

标签: hadoop hbase cluster-computing

当我尝试以这种方式创建一个HTable实例时。

Configuration conf = HBaseConfiguration.create();
HConnection conn = HConnectionManager.getConnection(conf);
conn.getTable("TABLE_NAME");

然后我得到了一个例外。

    @Override
    public HTableInterface getTable(TableName tableName, ExecutorService pool) throws IOException {
      if (managed) {
        throw new IOException("The connection has to be unmanaged.");
      }
      return new HTable(tableName, this, pool);
    }

那么,我想知道托管和'非托管'Hconnection的具体反映?

1 个答案:

答案 0 :(得分:2)

在调用HConnectionManager.getConnection之前,您必须使用HConnectionManager.createConnection创建连接,并将其传递给之前创建的HBaseConfiguration实例。 HConnectionManager.getConnection返回已存在的连接。关于它如何处理连接池的一点HConnectionManager javadoc:

  

此类具有由Configuration键入的静态HConnection实例映射;所有通过sameConfiguration实例的getConnection(Configuration)调用都将返回sameHConnection实例

在您的情况下,您只需使用HConnectionManager.createConnection创建连接并使用返回的连接即可打开HTable

编辑:

@ifiddddddbest,我发现了HConnectionImplementation的javadocs,其中包含了对托管标志的描述(可能会帮助你理解):

  

@param managed如果为true,则关闭时不会完全关闭;即   清除与zk的连接并关闭所有服务;我们刚刚   关闭此连接负责的资源和   减少使用计数器。由呼叫者完成   清理。当我们想要进行连接共享时设置 -   建立了zk连接和缓存区域位置的重用   regionserver连接等。当共享连接时,我们有   引用计数正在进行,只会在不再进行完全清理时进行   HConnectionImplementation实例的用户。

在较新版本的HBase(> 1.0)中,托管标志消失,现在所有连接管理都在客户端,例如。客户负责关闭它,如果它这样做,它关闭所有内部连接到ZK,HBase主机等,不仅减少参考计数器。