我正在将Hbase-Hadoop组合用于我的应用程序以及Data Nucleus作为ORM。
当我尝试一次通过多个线程访问hbase时。它会抛出异常:
Exception in thread "Thread-26" javax.jdo.JDODataStoreException
org.apache.hadoop.hbase.ZooKeeperConnectionException: HBase is able to connect to ZooKeeper but the connection closes immediately. This could be a sign that the server has too many connections (30 is the default). Consider inspecting your ZK server logs for that error and then make sure you are reusing HBaseConfiguration as often as you can. See HTable's javadoc for more information.
Caused by: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase
如果需要,我可以提供完整的堆栈跟踪。(因为完整的堆栈跟踪会让事情变得混乱)。
请帮我解决一下如何应对这种情况。是否需要进行任何配置来增加连接池?
答案 0 :(得分:7)
Zookeeper服务器具有活动连接限制,默认情况下为30。 您需要通过在zookeeper配置文件zoo.cfg中相应地设置maxClientCnxns属性来增加此限制。
100个连接:
maxClientCnxns=100
告诉zookeeper对连接数没有限制:
maxClientCnxns=0
答案 1 :(得分:1)
我不建议盲目地放弃最大连接数,根据ZK文档,此配置不是与ZK的最大连接数,而是每个客户端与ZK的最大并发连接数:
maxClientCnxns(没有Java系统属性)
限制并发连接数(在套接字级别) 由IP地址标识的单个客户端可以成为单个成员 ZooKeeper合奏。这用于防止某些类别的 DoS攻击,包括文件描述符耗尽。设置为0 或完全删除它可以消除并发连接的限制。
因此,必须从同一IP地址到ZK的并发连接超过30个。在这种情况下,请使用netstat
来调试该IP,并检查可以同时初始化多个连接的IP。
答案 2 :(得分:0)
对于上述问题,您需要重新启动HBase的主服务。 相同的命令是
sudo /etc/init.d/hadoop-hbase-master start
这需要在进入HBase shell之前完成。