【问题标题】:HBase Zookeeper Close ConnectionHBase Zookeeper 关闭连接
【发布时间】:2011-07-12 20:57:09
【问题描述】:

我正在尝试制作一个在 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 连接?

谢谢

【问题讨论】:

  • 不要忘记 - 如果您看到问题的正确答案,请单击答案旁边的复选框以“接受”它。

标签: hbase apache-zookeeper


【解决方案1】:

您运行的是什么版本的 ZooKeeper?很可能您正在点击issue 846

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

【讨论】:

    【解决方案2】:

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

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

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

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

    不过……

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

    这是什么意思?

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

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题。我解决它的方法是使配置对象静态。这样一来,应该只有一个连接(每个 jvm)。

      【讨论】:

        猜你喜欢
        • 2012-09-18
        • 1970-01-01
        • 2014-12-18
        • 1970-01-01
        • 1970-01-01
        • 2012-03-02
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多