Zookeeper CLI失败 - IOException数据包<len12343123123>超出范围</len12343123123>

时间:2012-04-20 16:01:59

标签: apache-zookeeper

运行zookeeper 3.3.3。我有一个znode,我只是想通过CLI列出,如:

ls / myznode / subznode

这在第710行的org.apache.ClientCnxn $ SendThread.readLength中发生IOException崩溃。

有人见过这个吗?有人建议znode中可能存在坏数据。不确定是否,或者如何...但我也不能删除它,因为它有内容。

7 个答案:

答案 0 :(得分:10)

我可以通过增加列表调用的最大大小来解决这个问题。

我添加了&#34; -Djute.maxbuffer = 50111000&#34;到我的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 "$@"

然后我能够列出&amp;使用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

来修复它