运行zookeeper 3.3.3。我有一个znode,我只是想通过CLI列出,如:
ls / myznode / subznode
这在第710行的org.apache.ClientCnxn $ SendThread.readLength中发生IOException崩溃。
有人见过这个吗?有人建议znode中可能存在坏数据。不确定是否,或者如何...但我也不能删除它,因为它有内容。
答案 0 :(得分:10)
我可以通过增加列表调用的最大大小来解决这个问题。
我添加了" -Djute.maxbuffer = 50111000"到我的zkCli.sh脚本,以便它使用以下行启动客户端:
$JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
"-Djute.maxbuffer=49107800" -cp "$CLASSPATH" $CLIENT_JVMFLAGS $JVMFLAGS \
org.apache.zookeeper.ZooKeeperMain "$@"
然后我能够列出&使用rmr / big / node
答案 1 :(得分:4)
所以,问题在于所讨论的znode已被子znode所淹没。它有大约500万。 Zookeeper显然不喜欢这个。更糟糕的是,没有很好的方法来清理它。 ZK应该有一个修剪命令(或其他东西)。谢谢你的回答。
答案 2 :(得分:3)
鉴于您提到的错误行,
707 void readLength() throws IOException {
708 int len = incomingBuffer.getInt();
709 if (len < 0 || len >= packetLen) {
710 throw new IOException("Packet len" + len + " is out of range!");
711 }
712 incomingBuffer = ByteBuffer.allocate(len);
713 }
可能是您的数据包长度大于jute.maxBuffer
允许的数据包长度。默认值为4M,这应该足够了,但您可能已经定义了具有明显较低值的属性。
无论如何,你有非常大量的孩子吗?
答案 3 :(得分:3)
我有相同的数据包超出范围异常,但出于一个非常愚蠢的原因。我指定的端口号是我的solr实例而不是嵌入式zookeeper。我将其更新为
bin / solr zk upconfig -z http://localhost: 9983 / -n mynewconfig -d / path / to / configset我的实例在 8983上运行
嵌入式zookeeper端口默认为localhost:(hostPort + 1000)
希望能帮助像我一样的人。
答案 4 :(得分:1)
在我的情况下,这个错误是由于SolrCloud(4.8.0)的“漏洞”版本,升级到最新版本(4.8.1),问题消失了。
答案 5 :(得分:0)
您是否尝试过以编程方式访问它?像
这样的东西ZooKeeper zooKeeper = new ZooKeeper(hostPort, 3000, myWatcher);
String path = "/myznode/subznode"
List<String> children = zooKeeper.getChildren(path, false);
for (String child : children) {
System.out.println(child);
}
答案 6 :(得分:0)
我有类似的问题,我可以通过将zookeeper端口修复为2181
来修复它