我有一个拥有数十万个节点的ZooKeeper路径(一个父节点,100,000多个子节点,没有其他子节点)。如果我尝试使用CLI和rmr
命令删除它,它会等待大约一分钟并因以下堆栈跟踪而失败:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at org.apache.zookeeper.ZKUtil.deleteRecursive(ZKUtil.java:50)
at org.apache.zookeeper.ZooKeeperMain.processZKCmd(ZooKeeperMain.java:714)
at org.apache.zookeeper.ZooKeeperMain.processCmd(ZooKeeperMain.java:599)
at org.apache.zookeeper.ZooKeeperMain.run(ZooKeeperMain.java:362)
at org.apache.zookeeper.ZooKeeperMain.main(ZooKeeperMain.java:290)
在内部看来,rmr
正在创建一个包含所有节点名称的变量,并且此变量超出了可用内存。据推测,需要这样做以确保删除是原子操作吗?
我可以使用-Xmx
来提高内存,但是想知道是否有更好的方法。我不要求这是一个原子操作,但是希望避免编写一个迭代每个脚本的脚本并单独删除它。