我正在尝试创建一个在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
连接?
由于
答案 0 :(得分:3)
静态HConnectionManager对象管理与HBase和ZooKeeper的连接。此对象是Configuration(真正HBaseConfiguration)个对象到HConnection个对象的地图。
HConnectionManager允许您通过调用deleteConnection方法来清理配置实例的连接。
因此,如果您想强行关闭连接,只需将以下行添加到代码段的底部:
//free resources and close connections
HConnectionManager.deleteConnection(config,true);
...然而
HBase API旨在通过单个HConnection复用客户端事务,只要HTable的多个实例共享同一个Configuration对象,它们就会使用相同的HConnection。这样可以节省所有连接设置并减少重复交易的开销。
这是什么意思?
这意味着如果可能,您确实希望限制每个进程的HBaseConfiguration实例数,即使它们在多个线程之间共享。但是,请记住HBaseConfiguration are not thread safe的实例,因此不应该由多个线程修改它们。
答案 1 :(得分:1)
我有类似的问题。我解决它的方法是使Configuration对象静态。通过这种方式,应该只有一个连接(每个jvm)。
答案 2 :(得分:0)
您正在运行什么版本的ZooKeeper?很可能是你正在点击issue 846。
尝试将ZooKeeper升级到3.3.2或更高版本。