zookeeperの実行3.3.3。次のように、CLIを介して一覧表示しようとしているznodeがあります。
ls / myznode / subznode
これは、行710のorg.apache.ClientCnxn$SendThread.readLengthのIOExceptionでクラッシュします。
誰もがこれを見た?誰かがおそらく悪いデータがznodeにあると示唆しました。かどうか、どのようにすればよいかわかりませんが、何かが含まれているため、削除することもできません。
zookeeperの実行3.3.3。次のように、CLIを介して一覧表示しようとしているznodeがあります。
ls / myznode / subznode
これは、行710のorg.apache.ClientCnxn$SendThread.readLengthのIOExceptionでクラッシュします。
誰もがこれを見た?誰かがおそらく悪いデータがznodeにあると示唆しました。かどうか、どのようにすればよいかわかりませんが、何かが含まれているため、削除することもできません。
リスト呼び出しの最大サイズを増やすことで、これを回避できました。
「-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 を一覧表示して使用することができました
そのため、問題は、問題の znode がサブ znode で圧倒されていることでした。その数は約500万人でした。Zookeeper はどうやらこれが気に入らないようです。さらに悪いことに、それをクリーンアップする優れた方法はありません。ZK には prune コマンド (または何か) が必要です。答えてくれてありがとう。
あなたが言及したエラー行を考えると、
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 で、これで十分ですが、かなり低い値でプロパティを定義した可能性があります。いずれにせよ、あなたには非常に多くの子供がいますか?
I had a similar problem and I was able to fix it by fixing the zookeeper ports to 2181
プログラムでアクセスしようとしましたか?何かのようなもの
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);
}