问题描述:
在一次测试过程中,ZK写入了70W+节点,总数据量70多M,此时想去删除,尝试了下面几个方案:
方案1.利用代码原生的方法进行删除
CuratorFramework的deletingChildrenIfNeeded进行删除,发现报错
java.io.IOException: Packet len8854970 is out of range!
查看相关代码:
protected final ByteBuffer lenBuffer = ByteBuffer.allocateDirect(4);
protected ByteBuffer incomingBuffer = lenBuffer;
protected void readLength() throws IOException {
int len = incomingBuffer.getInt();
if (len < 0 || len >= ClientCnxn.packetLen) {
throw new IOException("Packet len" + len + " is out of range!");
}
incomingBuffer = ByteBuffer.allocate(len);
}
public static final int packetLen = Integer.getInteger("jute.maxbuffer", 4096 * 1024);
默认的单个package的长度是1M,需要设置更大的参数。方案1失败,于是有了方案二:
方案二:Java客户端手动设置单个包的大小
static { System.setProperty("jute.maxbuffer", Integer.MAX_VALUE + ""); }
通过上面的代码可以看出最后需要转化为整型,所以我设置了整型的最大值Integer.MAX_VALUE,满心欢喜的等待结果,可惜事与愿违,还是报了下面的错误
Java.io.IOException: Unreasonable length = 1486176
虽然有点不开心,不过问题总算朝着正确的方向推进,针对这个报错,调整了这个参数大小
方案三,修正参数:
static { System.setProperty("jute.maxbuffer", (Integer.MAX_VALUE -1024) + ""); }
这次终于正确的跑起来了
其他尝试的方案:
直接使用ZKCLI进入,也会报超时的错误
再或者可以手动初始化整个ZK
系统设置的话需要再JVAA_OPTS上所有的zk server上都进行设置
相关JIRA: