近期需要整理MIT6.824 中 分布式系统协调服务 zookeeper 的一些知识,想要在Mac 本地搭建一个可以方便运行调试的zookeeper环境,这玩意竟然耗费了一上午的时间,实在是不可忍;当然,主要还是因为对Java的编译运行环境 以及 周边工具不太熟悉。

希望能够为后续想要学习的同学们节省更多的时间。

OS环境:MAC
zookeeper 版本:3.5.8 (更高版本 因为变更了编译配置,所以没有去搞)
java环境:15.0.1

文章目录

  • 1. 编译前基本环境准备
  • 2. 编译 及 导入 Intellij IDEA
  • 3. Zookeeper 运行环境配置

1. 编译前基本环境准备

  • 安装基本的java以及jdk
    运行java --version,显示如下:

    表示java环境已经配置好了,不需要再进行java环境的配置。

    否则需要执行如下步骤:
    a. 安装java brew install java
    b. 安装jdk环境,通过https://www.oracle.com/java/technologies/javase-jdk15-downloads.html 下载mac操作系统的最新版本jdk,直接按照正常的软件安装方式安装即可。

  • 安装软件,这里还是用强大通用的intellij-idea即可
    brew cask intall intellij-idea ,可能需要搞一个破解的,这里就看大家各显神通了,淘宝、闲鱼啥的

  • 安装maven ,用来安装java的包依赖
    brew install mvnvm
    最后运行mvn --version,显示如下表示安装成功

  • 通过mvn 安装idea的java依赖包
    mvn -e idea:idea
    或者 也可以通过 后面下载好的zookeeper代码中的pox.xml 导入到idea打开的zookeeper项目中

  • 安装ant
    https://ant.apache.org/bindownload.cgi 下载最新的tar包,将解压好的目录中的bin文件可以添加到环境变量中export PATH=$PATH:/xxx/bin/。 大家都说这是一个巨古老的java编译方式,比较好奇zookeeper为什么还会一直用

  • zookeeper 3.5.8 源码准备

    git clone https://github.com/apache/zookeeper.git
    git checkout branch-3.5.8
    

2. 编译 及 导入 Intellij IDEA

  • 编译 zookeeper代码
    a. cd zookeeper
    b. ant eclipse

  • 导入Intellij IDEA
    打开zookeeper目录即可

  • 项目的依赖配置,这里主要是指定一下jdk版本即可
    command + ;打开项目配置
    或者 File --> Project Structure

    因为我们已经下载了最新版本的sdk,所以这里Add JDK之后会默认打开已经下载好的目录,直接Open即可

  • 配置zookeeper项目的依赖包
    找到zookeeper目录下的pox.xml文件,右键点击 进行Reimport

3. Zookeeper 运行环境配置

  1. zoo.cfg 配置
    zookeeper服务运行的时候需要加载zoo.cfg 文件,这个文件默认是没有的,但是zoo_sample.cfg 文件存储在下载好的源码目录中:zookeeper/conf
    可以cp zoo_sample.cfg zoo.cfg,可以直接用默认的配置即可(测试也只是本地运行,非集群模式)

  2. zookeeper 的编译运行配置
    zk的运行需要通过主类 org.apache.zookeeper.server.ZooKeeperServerMain 启动

    编辑 run configuration

  3. 将主类信息,zoo.cfg绝对路径,你的zookeeper主目录添加进去
    如下:

  4. 运行

    点击运行,Intellij IDEA会先编译,再运行zk server

    如果,编译过程中出现如下问题:
    a. SLF4J: Class path contains multiple SLF4J bindings. 同时这个错误下应该还会有两个冲突路径,大体原因是再初始化日志模块时发现zk依赖了两个日志类,java认为是有冲突的,我的做法是将其中的一个直接注掉(mv xx xx-bak),因为我的两个冲突日志类是一样的,之前执行mvn -e idea:idea的时候有一部分类导入了两次。

    或者更好的解决办法是 从项目的依赖中将另一个类的路径 标记为exclude中的一项。

    b. log4j:WARN No appenders could be found for logger 这个问题同样是日志问题,是找不到log4j的初始化配置,即同样存在于目录zookeeper/conf/log4j.properties文件。

    我的做法是直接将绝对路径设置到运行时的编译配置中。
    回到 Exit configuration command + option + r

    添加路径:
    -Dlog4j.configuration=file:/Users/xxxxx/IdeaProjects/zookeeper/conf/log4j.propertiesVM options选项中即可

    再次运行 即zk sever 已经正常启动,并输出日志:

  5. 链接测试
    再用终端的zkCli.sh工具链接测试,能够与server通信,进入zk交互命令行成功

    cd /zookeeper/bin  sh zkCli.sh
    ...
    2020-11-15 13:31:40,529 [myid:] - INFO  [main:ClientCnxn@1653] - zookeeper.request.timeout value is 0. feature enabled=
    Welcome to ZooKeeper!
    2020-11-15 13:31:40,539 [myid:localhost:2181] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1112] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
    JLine support is enabled
    2020-11-15 13:31:40,554 [myid:localhost:2181] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@959] - Socket connection established, initiating session, client: /127.0.0.1:58600, server: localhost/127.0.0.1:2181
    2020-11-15 13:31:40,599 [myid:localhost:2181] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1394] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x10057c92b3d0000, negotiated timeout = 30000WATCHER::WatchedEvent state:SyncConnected type:None path:null
    [zk: localhost:2181(CONNECTED) 4] stat /
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x0
    cversion = -1
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 1
    

zookeeper -- Mac 上 Intellij IDEA 配置 zookeeper(3.5.8) 源码阅读、运行、调试环境相关推荐

  1. Windows上IDEA搭建最新Spark2.4.3源码阅读及调试的开发环境

    相信很多同学都想通过阅读一些框架的源码,来提高自己的代码能力,但往往在第一步,搭建环境的时候就碰了壁. 本篇就来介绍下如何在Windows下,将最新版的Spark2.4.3编译,并导入到IDEA编译器 ...

  2. 在Devstack基础上开发dashboard(二)——从horizon源码到运行

    devstack版本: queens 运行环境: CentOS Linux release 7.5.1804 起因:windows编辑好的项目上传服务器后,启动失败 在我从github上clone了h ...

  3. mac上adb安装配置

    什么是adb? adb工具即Android Debug Bridge(安卓调试桥) tools.它就是一个命令行窗口,用于通过电脑端与模拟器或者真的设备交互. mac上adb的配置步骤 打开mac的终 ...

  4. zookeeper 源码阅读(1)

    对于源码阅读的几点建议和方式: 1.尽量本地调试可以跑起来代码 2.debug 日志梳理代码执行流程,这样起到事半功倍的作用 3.干巴巴看代码毫无意义,难度极大 zk 是分别有c语言编写的和java ...

  5. zookeeper 源码阅读(3)

    接着zookeeper 源码阅读(2) 这里详细看下工厂模式创建的zkServer,后面在介绍分析那三种选举算法 public class QuorumPeer extends ZooKeeperTh ...

  6. zookeeper 源码阅读(2)

    接着zookeeper 源码阅读(1) Zookeeper服务器的启动,大致可以分为以下五个步骤 1. 配置文件解析. 2. 初始化数据管理器. 3. 初始化网络I/O管理器. 4. 数据恢复. 5. ...

  7. Mac上Homebrew安装应用非常慢、切换Homebrew源

    Homebrew时mac上非常好用的一个包管理工具,但由于网络环境原因,可能在使用Homebrew安装应用的时候会非常慢,甚至有的时候都下载不了,网络链接不成功. 其实,Hombrew主要分为2部分: ...

  8. Zookeeper源码阅读(一)Jute和传输协议

    前言 最近开始了Zookeeper的源码阅读和分析,也从现在开始把之前和现在学习到的一些Zookeeper的源码知识和我的一些理解放到博客上.不得不说这是自己第一次去完整的看一个开源项目的完整源码,从 ...

  9. 【Dubbo源码阅读系列】之远程服务调用(上)

    今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...

最新文章

  1. 在不root手机的情况上读取Data目录上的文件
  2. 西工大计算机专业课考什么,我的西北工业大学计算机考研之路总结
  3. 基于特征点匹配的自适应目标跟踪算法
  4. 统计123出现次数_如何使用 count 统计词条出现次数?
  5. 最大似然估计 (MLE) 最大后验概率(MAP)
  6. ③pycharm的基本使用
  7. Spring Boot 核心知识,深入剖析!
  8. Spark(十二) -- Spark On Yarn Spark as a Service Spark On Tachyon
  9. java activemq jmx_通过JMX 获取Activemq 队列信息
  10. 外媒:科学家首次探测到黑洞吞噬中子星
  11. 通讯软件通常要哪几个端口_您通常打开几个浏览器标签?
  12. 把html压缩成dll,一篇文章带你浅入webpack的DLL优化打包
  13. oracle创建索引后sqlldr导入错误
  14. 江娱互动:游戏领域 Serverless 架构探索之路
  15. uint8_t和char的相互转换
  16. C# 处理PPT水印(一)——添加水印效果(文字水印、图片水印)
  17. Spring Boot 异步线程静态获取request对象为空 RequestContextHolder 为空 Java 异步线程获取request为空
  18. Activity软盘配置
  19. VM15安装macOS一些问题,unlocker解锁后无mac选项,mac系统磁盘分区问题
  20. day15 Java 常用类 StringBuffer类

热门文章

  1. 【Opencv】直方图函数 calchist()
  2. 【C#公共帮助类】10年代码,最全的系统帮助类
  3. JAVA-Eclipse快捷键
  4. displaytag 导出
  5. c++ Qt向PHP接口POST文件流
  6. express给html设置缓存,webpack + express 实现文件精确缓存
  7. python中如何判断两个字符串是否相等_python怎样判断两个字符串是否相同
  8. http和dubbo的区别_(转载)Dubbo 接口是什么? 与http 接口有什么区别
  9. Java数组传参sql_Java中如何传一个数组作为筛选条件操作数据库(sql中foreach的使用)...
  10. java编程游戏飞机旋转问题_用JAVA写的一个飞机游戏