4

Apache Tomcat で実行され、HBase テーブル スキャンを行う操作が 1 つしかない単純な Web サービスを作成しようとしています。設定を取得する方法は次のとおりです。

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 ごとに) 接続は 1 つだけになるはずです。

于 2011-07-12T15:12:57.577 に答える
0

What version of ZooKeeper are you running? It could well be that you are hitting issue 846.

Try upgrading ZooKeeper to 3.3.2 or later.

于 2011-03-15T15:46:12.387 に答える