使用OutOfMemoryError删除具有100,000多个节点的ZooKeeper路径失败

时间:2018-06-11 20:17:08

标签: apache-zookeeper

我有一个拥有数十万个节点的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来提高内存,但是想知道是否有更好的方法。我不要求这是一个原子操作,但是希望避免编写一个迭代每个脚本的脚本并单独删除它。

0 个答案:

没有答案