4

我正在尝试制作一个在 Apache Tomcat 上运行的简单 Web 服务,并且只有一个操作可以进行 HBase 表扫描。这是我获取配置的方式:

Configuration config = HBaseConfiguration.create();
config.set("hbase.zookeeper.quorum", "hdp-node");

Htable table = new HTable(config, "myTable");       

... scanner ...

scanner.close()
table.close()

问题是连接Zookeeper保持打开状态,当我达到一定数量的连接时,Zookeeper开始丢弃。

Zookeeper扫描后如何关闭连接?

谢谢

4

3 回答 3

3

与 HBase 和 ZooKeeper 的连接由静态HConnectionManager对象管理。该对象是Configuration(实际上是HBaseConfiguration)对象到HConnection对象的映射。

HConnectionManager 允许您通过调用其deleteConnection方法来清理配置实例的连接。

因此,如果您想强制关闭连接,只需将以下行添加到代码段的底部:

//free resources and close connections
HConnectionManager.deleteConnection(config,true);

然而...

HBase API 旨在通过单个 HConnection 多路复用客户端事务,只要HTable的多个实例共享相同的 Configuration 对象,它们就会使用相同的 HConnection。这样可以节省所有连接设置并减少重复事务的开销。

这是什么意思?

这意味着如果可能的话,您确实希望限制每个进程的 HBaseConfiguration 实例的数量,即使它们在多个线程之间共享。但是,请记住HBaseConfiguration 的实例不是线程安全的,因此不应由多个线程修改它们。

于 2011-05-03T22:52:13.317 回答
1

我有一个类似的问题。我解决它的方法是使配置对象静态。通过这种方式,应该只有一个连接(每个 jvm)。

于 2011-07-12T15:12:57.577 回答
0

你运行的是什么版本的 ZooKeeper?您很可能遇到问题 846

尝试将 ZooKeeper 升级到 3.3.2 或更高版本。

于 2011-03-15T15:46:12.387 回答