3

是否可以通过 Zookeeper CLI 读取带有空格的 znode?

我在区域下有 2 个值('us-west 1' 和 'us-east')

 [zk: localhost:2181(CONNECTED) 11] get /regions/
 us-west 1   us-east 

我可以读“我们-东方”。

[zk: localhost:2181(CONNECTED) 11] get /regions/us-east
null
cZxid = 0xa
ctime = Tue Jul 10 12:41:49 IST 2012
mZxid = 0xa
mtime = Tue Jul 10 12:41:49 IST 2012
pZxid = 0x1b
cversion = 9
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 9

但不是“美国西部 1”

[zk: localhost:2181(CONNECTED) 11] get /regions/us-west 1
Node does not exist: /regions/us-west 

我尝试了诸如 '%20'、'\'、'+' 等用于空间的选项,但没有任何效果。

4

2 回答 2

8

请尝试zookeepercli,如下:

$ zookeepercli --servers srv1,srv2,srv3 -c create "/demo_only 1" "the value"
$ zookeepercli --servers srv1,srv2,srv3 -c get "/demo_only 1" 
the value

zookeepercli是免费和开源的。免责声明:我是这个工具的作者。

于 2014-09-17T13:52:02.817 回答
3

看起来您将无法从 ZK 命令行客户端执行此操作。Zookeeper Java 客户端(可能是您正在使用的客户端)通过解析空格字符将命令(例如get)与其参数(例如/regions/us-west 1在您的情况下)分开,正如您在客户端提供的代码(例如 zookeeper-3.3 .5\src\java\main\org\apache\zookeeper\ZooKeeperMain.java):

public boolean parseCommand( String cmdstring ) {
    String[] args = cmdstring.split(" ");
    if (args.length == 0){
        return false;
    }
    command = args[0];
    cmdArgs = Arrays.asList(args);
    return true;
}

由于它们被“”分割,除非您split在调用命令时找到一种通过某种转义来克服该调用的方法,否则您get将无法使用此客户端检索这些节点。上面的代码将您的1inget调用解释为参数,如您在命令语法watch中所见:get

获取路径 [观看]

我建议您使用不同的字符,例如“_”,而不是 znodes 命名上的空格。如果这不是一个选项,您将需要自己修改 ZK Java 客户端,或者使用其他客户端。

于 2012-07-10T11:33:48.980 回答