【问题标题】:Zookeeper CLI - wildcard supportZookeeper CLI - 通配符支持
【发布时间】:2014-09-23 00:07:37
【问题描述】:

看起来 zookeeper CLI (zkCli.sh) 不支持通配符 - 我还没有查看 zookeeper 代码来确定它是否不可能设计明智,或者我是否在这里遗漏了一些愚蠢的东西。

那么递归删除以字符串开头的节点的最佳方法是什么。我想做类似的事情:

./zkCli.sh rmr abc*

删除所有以 abc 开头的节点。除了使用 Java/Python 或类似的客户端之外,还有什么更简单的方法吗?或者换句话说,这仅通过 ZK CLI 就可以实现吗?

【问题讨论】:

    标签: apache-zookeeper


    【解决方案1】:

    不,目前zkCli.sh不支持通配符去除(根据实现 DeleteCommandDeleteAllCommand,这是 zkCli.sh 使用的类)

    但是,创建解决方法非常简单,例如在 Python 中使用Kazoo。结帐this gist,用法为:python zkDelAll.py /abc

    有趣的是,* 是一个有效的路径字符,因此您可以使用路径 /abc* 创建一个 znode。

    编辑: gist 的核心实现如下:

    from kazoo.client import KazooClient
    zk = KazooClient(hosts='localhost:2181')
    zk.start()
    for child in zk.get_children('/'):
        if child.startswith('abc'):
            zk.delete('/' + child)
    zk.stop()
    

    【讨论】:

    • 虽然这可能会回答这个问题,但it would be preferable 在此处包含答案的更多重要部分,并提供链接以供参考。
    • 我最终发现如果不使用客户端可能无法做到这一点,并编写了我自己的一个。还更改了 Zookeeper CLI 代码以支持通配符 - 发送邮件并打开 issues.apache.org/jira/browse/…> 以检查它是否对 CLI 有用。此外,发现 abc* 是有效路径并且因此我在我的 Zookeeper cli 代码中使用了接受 Java 正则表达式的 switch 来对给定路径进行批量删除或 ls。
    • 感谢您的解决方案。有用。一个简单的信息,如果您遇到类似“NotEmptyError”的错误,那是因为您要删除的孩子有孩子。如果在这种情况下要删除,只需将 recursive=True 添加到 zk.delete 作为参数,例如 zk.delete('/' + child, recursive=True)
    猜你喜欢
    • 2011-01-26
    • 2023-03-06
    • 2021-10-22
    • 2020-10-16
    • 1970-01-01
    • 2021-12-14
    • 2018-04-21
    • 2015-07-14
    • 2015-06-08
    相关资源
    最近更新 更多