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

Apache zookeeper Zookeeper CLI失败-IOException数据包<;len12343123123>;超出范围,apache-zookeeper,Apache Zookeeper,运行zookeeper 3.3.3。我正试图通过CLI列出一个znode,如: ls/myznode/subznode 这会在org.apache.ClientCnxn$SendThread.readLength的第710行出现IOException时崩溃 有人看到这个吗??有人建议,znode中可能有坏数据。不确定是否或如何。。。但是我也不能删除它,因为它里面有东西。您是否尝试通过编程方式访问它?差不多 ZooKeeper zooKeeper = new ZooKeeper(hostPort,

运行zookeeper 3.3.3。我正试图通过CLI列出一个znode,如:

ls/myznode/subznode

这会在org.apache.ClientCnxn$SendThread.readLength的第710行出现IOException时崩溃


有人看到这个吗??有人建议,znode中可能有坏数据。不确定是否或如何。。。但是我也不能删除它,因为它里面有东西。

您是否尝试通过编程方式访问它?差不多

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);
}
ZooKeeper ZooKeeper=新的ZooKeeper(主机端口,3000,myWatcher);
字符串路径=“/myznode/subznode”
List children=zooKeeper.getChildren(路径,false);
for(字符串子项:子项){
系统输出打印项次(子项);
}

根据您提到的错误行

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         }
707 void readLength()引发IOException{
708 int len=incomingBuffer.getInt();
709如果(len<0 | | len>=packetLen){
710抛出新IOException(“数据包len+len+超出范围!”);
711             }
712 incomingBuffer=ByteBuffer.allocate(len);
713         }
可能是您的数据包长度大于
jute.maxBuffer
允许的长度。默认值为4M,这应该足够了,但是您可能已经用一个低得多的值定义了属性。
在任何情况下,您是否有非常多的孩子?

因此,问题是所讨论的znode已被子znode淹没。它有大约500万个。动物园管理员显然不喜欢这样。更糟糕的是,没有什么好办法来清理它。ZK应该有一个prune命令(或其他)。谢谢你的回答。

我可以通过增加登录呼叫的最大大小来解决这个问题

我将“-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

在我的例子中,这个错误是由于SolrCloud(4.8.0)的一个“错误”版本,升级到最新版本(4.8.1),问题消失了。

我有同样的数据包超出范围异常,但出于一个非常愚蠢的原因。我指定的端口号是为我的solr实例而不是嵌入式zookeeper指定的。我更新到

bin/solr zk upconfig-z:9983/-n mynewconfig-d/path/to/configset,我的实例在8983上运行

嵌入式zookeeper端口默认为localhost:(主机端口+1000)


希望它能帮助像我这样刚起步的人。

我也遇到过类似的问题,我通过将zookeeper端口设置为2181来解决它。

太棒了,谢谢!更简单的是,从shell运行脚本,如
JVMFLAGS=“$JVMFLAGS-Djute.maxbuffer=49107800 zkCli.sh…
,无需编辑。