我正在与zookeeper(http://zookeeper.apache.org/)合作。下载3.3.5并创建zoo.cfg并放在$ ZOOKEEPER / conf中,启动zookeeper使用zkServer启动。但以下是错误
请在这里帮助我..
nfig or no quorum defined in config, running in standalone mode
2012-08-01 23:20:32,175 [myid:] - ERROR [main:ZooKeeperServerMain@54] - Invalid
arguments, exiting abnormally
java.lang.NumberFormatException: For input string: "C:\Development\apps\zookeeper\zookeeper3.4.1\bin\..\conf\zoo.cfg"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:449)
at java.lang.Integer.parseInt(Integer.java:499)
at org.apache.zookeeper.server.ServerConfig.parse(ServerConfig.java:60)
at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:83)
at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:52)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:116)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
2012-08-01 23:20:32,177 [myid:] - INFO [main:ZooKeeperServerMain@55] - Usage: Z
ooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]
Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]
答案 0 :(得分:58)
只需省略“start”参数并改为调用“bin \ zkServer”。
答案 1 :(得分:2)
java.lang.NumberFormatException:对于输入字符串:“C:\ Development \ apps \ zookeeper \ zookeeper3.4.1 \ bin .. \ conf \ zoo.cfg”
看来你运行带有“start”的zkServer和zoo.cfg文件的位置,即“C:\ Development \ apps \ zookeeper \ zookeeper3.4.1 \ bin .. \ conf \ zoo.cfg” ,和另一个参数,最多可以添加3个参数:
./ zkServer start C:\ Development \ apps \ zookeeper \ zookeeper3.4.1 \ bin .. \ conf \ zoo.cfg xxx
因此,只需删除第二个和第三个参数就可以解决问题,这使命令成为:
./ zkServer start
这背后的原因是因为类(QuorumPeerMain,ZooKeeperServerMain)zkServer用于初始化zookeeper系统接受各种数量的参数并相应地表现。当您向zkServer提供两个参数时,两个参数背后的含义应该是port和datadir。是的,端口应该是一个数字,这就是你的炸弹。
顺便说一句,当你执行它们而没有任何参数时,引导脚本会随附帮助说明。
答案 2 :(得分:1)
在zoo.cfg文件中 goto dataDir = / usr / zookeeper / data
在 data 文件夹中,创建一个名为myid的文件并写入1。保存该文件并启动zkServer
如果您正在运行多个实例,则需要为每个实例在数据文件夹中创建myid文件并分别以1,2,3进行写入。实际上,这是用于节点领导者的选举。
答案 3 :(得分:0)
sudo ./zkServer.sh start
[sudo] password for administrator:
/bin/java
ZooKeeper JMX enabled by default
Using config: apache-zookeeper-3.5.5/bin/../conf/zoo.cfg
Starting zookeeper ... FAILED TO START
解决方法是:download bin.tar file "apache-zookeeper-3.5.5-bin.tar.gz "
我误下载了一个tar文件,
答案 4 :(得分:0)
打开zkServer.cmd,找到此行
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" "-Dzookeeper.log.file=%ZOO_LOG_FILE%" "-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*
,然后删除该行末尾的%*
。新的开始cmd行应为:
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" "-Dzookeeper.log.file=%ZOO_LOG_FILE%" "-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%"
然后运行zkServer start
或zkServer
。现在应该可以使用了。
说明:
在ZkServer源代码中。 ZooKeeperServerMain.java
protected void initializeAndRun(String[] args) throws ConfigException, IOException, AdminServerException {
try {
ManagedUtil.registerLog4jMBeans();
} catch (JMException e) {
LOG.warn("Unable to register log4j JMX control", e);
}
ServerConfig config = new ServerConfig();
if (args.length == 1) {
config.parse(args[0]);
} else {
config.parse(args);
}
runFromConfig(config);
}
对于不同的参数长度,有不同的解析方法。
如果有一个参数,它将被当作配置文件路径。
如果有多个参数,则有固定的顺序。
1st arg(must): server port.
2nd arg(must): dataDir
3rd arg(optional): tickTime
4th arg(optional): maxClientCnxns
所以回到zkServer.cmd,参数位置有两个占位符。
%ZOOMAIN% "%ZOOCFG%" %*
我相信开发人员期望%*
有一个空格,因此它只会一个参数。
但是,对于大多数zk用户而言。它们用于使用zkServer start
来启动服务器。
最后,cmd变成:
org.apache.zookeeper.server.quorum.QuorumPeerMain "C:\Users\...\scoop\apps\zookeeper\current\bin\..\conf\zoo.cfg" "start"
使用两个参数。第一个参数(此处的配置路径)用作端口号。然后我们有例外。
更多,直接使用zkServer
启动zooKeeper怎么样?
就我而言,我面临着同样的问题。虽然我们没有任何论点。 zkServer.cmd仍将一个空字符串传递给main方法。像这样:
org.apache.zookeeper.server.quorum.QuorumPeerMain "C:\Users\...\scoop\apps\zookeeper\current\bin\..\conf\zoo.cfg" ""
结论:只需删除冗余占位符%*