zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

除了前面的直接下载zk的正式版以外,我们也可以选择下载zk源码,进行编译,然后配置启动zk服务端,此种方式的好处是zk的所有代码和启动类代码等都可以进行自定义编写和修改,但是较为繁琐,我们先来了解一下:

1.zk源码需要使用Ant进行编译,所以我们需要进入Ant官网下载对应的版本,进行配置

下载地址如下:http://ant.apache.org/bindownload.cgi,这里需要注意的是我们下载的ant版本分为jdk1.5兼容版本和jdk1.8版本,我们需要按照当前开发环境的jdk版本以及需要编译的zk源码的版本与之对应,点击下载:

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

下载完成后,我们将其解压,开始配置环境变量,例如:

1.  `ANT_HOME=E:\apache-ant-1.10.5`

</pre>

并且我们需要在全局的path路径下添加一个**%ANT_HOME%\bin** ,配置完毕后,我们进入cmd窗口,执行如下命令:


1.  `C:\Users\Administrator>ant -version`

2.  `ApacheAnt(TM) version 1.10.7 compiled on September12019`

</pre>

可以看到成功返回了ant的版本信息,代表此时配置已经成功。

**2.进入github进行下载,我们找到当前所有的 **branchs:

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

找到我们需要版本的分支,进行git下载:


1.  `$ git clone -b branch-3.5.6 https://github.com/apache/zookeeper.git`

2.  `Cloning into 'zookeeper'...`

3.  `remote: Enumerating objects: 1, done.`

4.  `remote: Counting objects: 100% (1/1), done.`

5.  `remote: Total59332(delta 0), reused 0(delta 0), pack-reused 59331`

6.  `Receiving objects: 100% (59332/59332), 113.97MiB| 41.00KiB/s, done.`

7.  `Resolving deltas: 100% (38347/38347), done.`

</pre>

3.进入刚才下载的zk源码目录,启动cmd窗口,输入编译命令


1.  `G:\开发软件>cd zk-3.5.6`

2.  `G:\开发软件\zk-3.5.6>cd apache-zookeeper-3.5.6`

3.  `G:\开发软件\zk-3.5.6\apache-zookeeper-3.5.6>ant eclipse`

</pre>

然后等待最终编译成功输出,如果为 build successful字样则为成功

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

接下来,我们将代码导入开发工具(官方使用的是eclipse,这里我们使用ieda),

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

一路next,最后将maven编译完成,即可完成源码的编译,我们可以看到源码的目录如下:

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

而加载完毕后,我们可以看到,zk3.5版本起,官方将模块分离出来了,多出了很多的子模块,比如文档说明相关在 zookeeper-docs工程下,而zk的一些基础数据结构类定义相关则在 zookeeper-jute工程下,而zk的客户端和服务端相关的代码则是分别在zookeeper-client与 zookeeper-server工程下,而在server工程下我们可以找到两个启动类: ZooKeeperServerMain以及 QuorumPeerMain,分别位于org.apache.zookeeper.serverorg.apache.zookeeper.server.quorum包下,其中单机版的zk使用 ZooKeeperServerMain作为启动类,集群版的zk使用 QuorumPeerMain启动类。现在我们尝试启动单机版的zk,运行 ZooKeeperServerMain类,结果如下:


1.  `错误: 找不到或无法加载主类 org.apache.zookeeper.server.ZooKeeperServerMain`

</pre>

这是怎么回事呢?难道是jdk版本不对?但是我们查阅了官网,zk3.5.x版本对应的jdk的确是1.8,那么只有一种可能就是编译出来的class不是当前jdk编译的,我们这里选择将zookeeper-server的工程重新编译一下:

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

却看到compile的时候控制台报错了,如下:


1.  `[ERROR] Failed to execute goal org.codehaus.mojo:properties-maven-plugin:1.0.0:read-project-properties (default) on project zookeeper: Properties could not be loaded from File: D:\360安全浏览器下载\zk-3.5.6- 副本\zookeeper-server\src\main\resources\git.properties -> [Help1]`

</pre>

看报错的原因,似乎是有部分代码使用了resources\git.properties文件的配置,但是我们找了一下,在github上的代码中不会存在git.properties,那么是哪里出问题了呢?我们来到pom中找到了 properties-maven-plugin插件,看到了如下的配置:

1.  `<plugin>`

2.  `<groupId>org.codehaus.mojo</groupId>`

3.  `<artifactId>properties-maven-plugin</artifactId>`

4.  `<executions>`

5.  `<execution>`

6.  `<phase>initialize</phase>`

7.  `<goals>`

8.  `<goal>read-project-properties</goal>`

9.  `</goals>`

10.  `<configuration>`

11.  `<files>`

12.  `<file>${basedir}/src/main/resources/git.properties</file>`

13.  `</files>`

14.  `</configuration>`

15.  `</execution>`

16.  `</executions>`

17.  `</plugin>`

</pre>

原来是这里初始化的时候会加载该配置文件的内容,除此之外我们还注意到一个插件exec-maven-plugin,里面使用了部分参数在项目中并不存在,应该是引用了git.properties的配置参数导致了pom报错,并且初始化编译失败,如下:


1.  `<plugin>`

2.  `<groupId>org.codehaus.mojo</groupId>`

3.  `<artifactId>exec-maven-plugin</artifactId>`

4.  `<executions>`

5.  `<execution>`

6.  `<id>generate-version-info</id>`

7.  `<phase>generate-sources</phase>`

8.  `<goals>`

9.  `<goal>exec</goal>`

10.  `</goals>`

11.  `<configuration>`

12.  `<workingDirectory>${project.basedir}/src/main/java/</workingDirectory>`

13.  `<executable>java</executable>`

14.  `<arguments>`

15.  `<argument>-classpath</argument>`

16.  `<classpath  />`

17.  `<argument>org.apache.zookeeper.version.util.VerGen</argument>`

18.  `<argument>${project.version}</argument>`

19.  `<argument>${git.commit.id}</argument>`

20.  `<argument>${build.time}</argument>`

21.  `</arguments>`

22.  `</configuration>`

23.  `</execution>`

24.  `</executions>`

25.  `</plugin>`

26.  `<plugin>`

</pre>

并且我们也可以看到,这里需要这些参数的原因是为了配置VerGen的版本、时间等参数,查阅官方github才知道,VerGen仅仅是为了开发迭代的时候区分每个人的版本不重复冲突使用的,我们个人运行和查阅源码可以选择固定一个值,所以接下来我们来将properties-maven-plugin插件注释掉,并且将 g i t . c o m m i t . i d 与 {git.commit.id}与 git.commit.id与{build.time}两个参数改为自己的值,然后我们再次执行 mvn compile命令,此次编译成功!再次运行main方法,发现控制台出现了新的问题,输入如下:


1.  `log4j:WARN No appenders could be found for logger (org.apache.zookeeper.jmx.ManagedUtil).`

2.  `log4j:WARN Please initialize the log4j system properly.`

3.  `log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.`

4.  `Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]`

</pre>

但是我们当前的启动类没有配置log4j,导致无法输出对应的日志信息,我们找到当前test包下的resources里面的log4j.properties文件,在当前启动类配置上对应的文件目录(vm options):


1.  `-Dlog4j.configuration=file:G:\开发软件\zookeeper-release-3.5.6\zookeeper-server\src\test\resources\log4j.properties`

</pre>

再次运行,发现启动报错了:


1.  `2020-01-0701:28:48,727[myid:] - ERROR [main:ZooKeeperServerMain@66] - Invalid arguments, exiting abnormally`

2.  `java.lang.IllegalArgumentException: Invalid number of arguments:[]`

3.  `at org.apache.zookeeper.server.ServerConfig.parse(ServerConfig.java:60)`

4.  `at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:103)`

5.  `at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:64)`

6.  `2020-01-0701:28:48,729[myid:] - INFO  [main:ZooKeeperServerMain@67] - Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]`

</pre>

从报错信息可以得出,我们需要一个运行时传递的参数,但是没有配置,而这个参数就是我们启动服务的时候需要修改的zoo.cfg文件,再次配置修改完毕(上面启动用的zoo.cfg)的文件,如下:

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

这时我们再次运行,即可成功启动zk的单机服务!

cli常用命令

zk服务端启动以后,我们来开始学习zk客户端命令,首先双击 zkCli.cmd,会默认进行本地的zk连接操作,如下:

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

help

我们先来看看zk有哪些命令操作,在cmd窗口中输入 help命令回车,即可查看到zk当前支持的所有的命令,如下:


1.  `[zk: localhost:2181(CONNECTED) 0] help`

2.  `ZooKeeper-server host:port cmd args`

3.  `stat path [watch]`

4.  `set path data [version]`

5.  `ls path [watch]`

6.  `delquota [-n|-b] path`

7.  `ls2 path [watch]`

8.  `setAcl path acl`

9.  `setquota -n|-b val path`

10.  `history`

11.  `redo cmdno`

12.  `printwatches on|off`

13.  `delete path [version]`

14.  `sync path`

15.  `listquota path`

16.  `rmr path`

17.  `get path [watch]`

18.  `create [-s] [-e] path data acl`

19.  `addauth scheme auth`

20.  `quit`

21.  `getAcl path`

22.  `close`

23.  `connect host:port`

</pre>

接下来我们来学习常见的一些命令操作。

ls 查看

分享

这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

Spring Cloud实战

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

Spring Boot实战

zookeeper开山篇-编译安装与zk基础命令使用,字节跳动面试必问

,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

[外链图片转存中…(img-PaoqwyED-1630846385557)]

Spring Cloud实战

[外链图片转存中…(img-YyCx4iIo-1630846385557)]

Spring Boot实战

[外链图片转存中…(img-BWv2p0W7-1630846385558)]

面试题整理(性能优化+微服务+并发编程+开源框架+分布式)

上一篇:制作用于k8s集群中zookeeper3.6.3镜像(一)


下一篇:docker运行jar和直接运行jar