解決Mac上安裝Zookeeper問題:FAILED TO WRITE PID


今天在嘗試本地安裝Zookeeper,在官網下載穩定版本apache-zookeeper-3.7.0到本地后,解壓文件並將apache-zookeeper-3.7.0-bin文件夾移動至/usr/local目錄。

照例先將安裝目錄conf中的zoo_sample.cfg文件名修改為zoo.cfg。然后進入bin目錄,開始執行啟動操作:sh zkServer.sh start 出現了問題1如下:

Using config: /usr/local/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg

mkdir: illegal option -- e

usage: mkdir [-pv] [-m mode] directory ...

-n Starting zookeeper ... 

zkServer.sh: line 175: -e /tmp/zookeeper/zookeeper_server.pid: No such file or directory

FAILED TO WRITE PID

最開始以為是操作權限問題,於是開始修改文件權限,但是依然無效。

經過查詢后得知原來問題出在zkServer.sh這個啟動文件上,打開啟動文件找到如下指令:

ZOO_DATADIR="$(echo -e "${ZOO_DATADIR}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"

修改為:

ZOO_DATADIR="$(echo "${ZOO_DATADIR}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"

在3.7.0版本,這段配置在zkServer.sh文件的第120行。

修改完后繼續執行啟動操作:sh zkServer.sh start 現在出現了問題2如下:

2022-01-06 10:24:34,946 [myid:] - ERROR [main:ZooKeeperServerMain@86] - Unable to start AdminServer, exiting abnormally

org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands

at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:179)

at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:155)

at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:113)

at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:68)

at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:141)

at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:91)

Caused by: java.io.IOException: Failed to bind to /0.0.0.0:8080

at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349)

at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310)

at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)

at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:234)

at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)

at org.eclipse.jetty.server.Server.doStart(Server.java:401)

at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)

at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:170)

... 5 more

Caused by: java.net.BindException: Address already in use

at java.base/sun.nio.ch.Net.bind0(Native Method)

at java.base/sun.nio.ch.Net.bind(Net.java:455)

at java.base/sun.nio.ch.Net.bind(Net.java:447)

at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)

at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80)

at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:344)

... 12 more

這個比較簡單,因為AdminServer啟動時默認使用8080端口,但是我本地8080端口已經被占用了。

找到conf/zoo.cfg配置文件,添加一行admin.serverPort=xxxx,修改一下啟動的端口即可。(是的,默認配置8080而且沒有把配置項寫入配置文件中

修改后繼續執行啟動操作:sh zkServer.sh start 然后遇到了問題3:

2022-01-06 10:38:32,300 [myid:] - INFO  [main:NIOServerCnxnFactory@660] - binding to port 0.0.0.0/0.0.0.0:2181

2022-01-06 10:38:32,301 [myid:] - ERROR [main:ZooKeeperServerMain@91] - Unexpected exception, exiting abnormally

java.net.BindException: Address already in use

at java.base/sun.nio.ch.Net.bind0(Native Method)

at java.base/sun.nio.ch.Net.bind(Net.java:455)

at java.base/sun.nio.ch.Net.bind(Net.java:447)

at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)

at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80)

at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:73)

at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:662)

at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:160)

at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:113)

at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:68)

at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:141)

at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:91)

對的,又是一次端口被占用,但是這次是2181端口,細心的同學可能發現了,這是zookeeper client的默認端口。我懷疑我剛才在啟動server的時候server雖然因為端口被占用的原因沒有啟動,但是client卻正常啟動了。

執行操作:sh zkCli.sh close 即可解決問題。

現在再次執行zkserver啟動操作:sh zkServer.sh start

終於正常啟動了,打印日志如下:

Using config: /usr/local/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg

-n Starting zookeeper ... 

STARTED

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM