本文目录
本系列文章索引以及一些默认好的条件在 传送门
在配置Zookeeper之前,建议先配置Hadoop集群,具体的操作流程博主已更新完成,链接
Zookeeper的安装包版本不太相同,大致分为有编译过的和没有编译过的(如有错请留言指正
一般情况下对于我们在解压配置就能使用的情况下,我们可以下载编译之后的版本,比如在官网上:

下面代表着源代码,我们应该选择不在红框之内的
Zookeeper仓库
本文以3.5.9为例,应该下载上方连接中的:

这个版本的解压后和其他未编译过的有个显著的不同:在解压后有一个lib文件夹,通常里面保存着应该会用到的文件等
下载速度较快,不再网盘分享
如果防火墙处于打开的状态,会影响到虚拟机之间的互相访问,以及从主机通过web浏览器查看各个服务器节点的状态
命令:
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
将下载好的文件放到master节点的/usr/local/之下
然后解压文件,命令:
tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz
解压之后,将文件夹的名字去掉版本号:
mv apache-zookeeper zookeeper
然后跳转到./zookeeper/conf下,将官方给的zoo.cfg示例文件改名:
cp zoo_sample.cfg zoo.cfg
然后编辑zoo.cfg
大致改为:

切勿盲目CV,记得修改为自己的主机名
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper/data/
# the port at which the clients will connect
clientPort=2181
# master
server.1=0.0.0.0:2881:3881
server.2=slave01-315:2881:3881
server.3=slave02-315:2881:3881
在zookeeper根目录下,我们再创建一个data文件夹
mkdir -p /usr/local/zookeeper/data
然后创建并编辑myid文件
cd /usr/local/zookeeper/data
touch myid
vim myid
在master节点的myid中,写入一个数字1
注意不得加任何空格,任何注释,必须单纯一行一列一个字符’1’
我们需要将从master的文件放到slave1,slave2上
scp -r /usr/local/zookeeper slave1:/usr/local
scp -r /usr/local/zookeeper slave2:/usr/local
在slave1上,我们需要把/data/myid中的内容改为2
在slave2上,我们需要把/data/myid中的内容改为3
注意不得加任何空格,任何注释,必须单纯一行一列一个字符’1’
在slave1上,我们需要把/conf/zoo.cfg改成:

切勿盲目CV,记得修改为自己的主机名
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper/data/
# the port at which the clients will connect
clientPort=2181
server.1=master315:2881:3881
server.2=0.0.0.0:2881:3881
server.3=slave02-315:2881:3881
在slave2下,我们需要将/conf/zoo.cfg文件修改为:

切勿盲目CV,记得修改为自己的主机名
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper/data/
# the port at which the clients will connect
clientPort=2181
server.1=master315:2881:3881
server.2=slave01-315:2881:3881
server.3=0.0.0.0:2881:3881
如果是小白从头开始配的话,应该不会出现2181端口被占用的情况,如果说自己的2181端口被占用,可以kill -9该进程
查看进程是否被占用:
netstat -nltp | grep 2181
若显示空白则恭喜你不需要进行任何操作
若显示除了某进程占用该端口,应该kill -9 进程号
我们修改~/.bashrc文件
vim ~/.bashrc
加入:
export PATH=$PATH:/usr/local/zookeeper/bin
然后:
source ~/.bashrc
现在应该使得该文件生效了
zkServer.sh start
这时,我们查看zookeeper/data/下的所有文件:
cd /usr/local/zookeeper/data
ls -laF
发现除了myid还会有另外的若干文件(version-2文件夹&&zookeeper_server.pid),这是请注意:
如果不是通过命令使得zookeeper自动关闭的,在下次启动前均需删除该目录下除了myid的所有文件
在三个节点均启动zookeeper集群
启动命令是:zkServer.sh start
重启命令是:zkServer.sh restart
关闭命令是:zkServer.sh stop
查看状态命令是:zkServer.sh status
注意,在我们依次启动节点的zookeeper的过程中,可能会遇到首先启动的节点的日志文件中出现拒绝连接的情况,这时请忽略,原因是:
后续节点未启动,所以会导致和其他未开启的节点通信失败导致拒绝连接,我们应当查看最后启动zookeeper的结点的日志文件(/usr/local/zookeeper/logs/),
在我们成功启动集群之后,应该会看到:
master

slave1:

slave2:

出现started则证明启动成功,我们查看状态:
master:

slave1:

slave2:

在此,发现master为leader,其余两个节点为follower
这里的leader由zookeeper内部选举产生,谁是leader均有可能,不必太在意
在每个节点均输入:jps来查看相关进程
master:

slave1:

slave2:

到这里进本就证明安装没大问题了
但是为了严谨一点,我们测试下功能
我们进入zookeeper的命令行工具:
红框是命令zkCli.sh -server master315:2181

在箭头所示区域输入:
create /hello world
get /hello

可以发现莫得问题,然后就可以退出了
输入:
quit

到此,Zookeeper安装结束
如有问题可以 留言 or 私信 or q_2649432030


我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in