当我尝试以这种方式创建一个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的具体反映?
答案 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主机等,不仅减少参考计数器。