Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1885826
  • 博文数量: 1000
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7921
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-20 09:23
个人简介

storage R&D guy.

文章分类

全部博文(1000)

文章存档

2019年(5)

2017年(47)

2016年(38)

2015年(539)

2014年(193)

2013年(178)

分类: 服务器与存储

2015-10-13 14:37:37

下载zookeeper-3.5.5稳定版本

解压到/usr目录下,修改所属用户为hadoop

$chown –R hadoop:hadoop /usr/zookeeper-3.3.5

添加zookeeper目录到配置文件/etc/profile

$export ZOOKEEPER_INSTALL=/usr/zookeeper-3.3.5

$export PATH=$PATH:$ZOOKEEPER_INSTALL/bin

新建配置文件zoo.cfg,保存在conf子目录下,写入以下内容:

    tickTime=2000  Zookeeper服务器心跳时间,单位毫秒

dataDir=/home/hadoop/zookeeper # 数据持久化路径

clientPort=2181 # 连接端口

initLimit=5 # 投票选举新leader的初始化时间。

syncLimit=2 # LeaderFollower之间的最大响应时间单位,响应超过syncLimit*tickTimeLeader认为Follwer死掉,从服务器列表中删除Follwer

dataLogDir=/home/hadoop/zookeeper/logs 日志保存路径  这个要自己新建

server.1=namenode:2888:3888

server.2=datanode1:2888:3888

server.3=datanode2:2888:3888

server.4=datanode3:2888:3888  最好用主机名

其中2888端口号是zookeeper服务之间通信的端口,而3888zookeeper与其他应用程序通信的端口。由于jobtracker机器作为hadoop主机存在,故暂不作为zookeeper服务器

新建文件myid(zoo.cfg 配置的dataDir目录下,此处为/home/hadoop/zookeeper),使得myid中的值与server的编号相同,比如namenode上的myid 1datanode1上的myid2。以此类推。

/usr/zookeeper-3.3.5/home/hadoop/zookeeper文件夹分别分发到其它机器上。命令为scp,并修改相应的所属用户,myid的值和系统配置文件/etc/profile

测试:

$zkServer.sh start

会报FAILED TO WRITE PID的错误。查看进程发现zookeeper进程存在, 并可以正常使用。

这是zkServer.sh脚本的一个BUGdataDirzookeeper进程内部建立的,并且有一定延迟, 因此将zookeeper进程id写入到dataDir下的pidfile时,dataDir还没有建立好, 因此就出现了上述情况。

解决办法修改zkServer.sh脚本,等待dataDir目录创建完毕后再将pid写入。找到相应的语句块,替换为下面的语句,注意替换的范围

...

    if [ $? -eq 0 ]

    then

      while [ ! -d `dirname $ZOOPIDFILE` ]

      do 

        sleep 1;

      done

      if /bin/echo -n $zkpid > "$ZOOPIDFILE"

      then

        sleep 1

        echo STARTED

      else

        echo FAILED TO WRITE PID

        exit 1

      fi


进行测试:

    $zkServer.sh start

    $echo ruok | nc namenode 2181

    imok

zookeeper在说 I’m OK,可以把namenode换成集群里其它的主机名测试是否组网成功

在每台机器上分别执行zkServer.sh start,启动后通过jps看java进程是否出现QuoRumPeerIn,出现后再通过zkServer.sh status命令查看zookeeper的状态。然后echo ruok | nc namenode 2181,看是否会输出imok

而且集群中的zookeeper需要每台机器都启动zookeeper,保证每台机器的3888端口都是开通的


zookeeper启动时的错误:貌似已经zookeeper已经启动了,但是没有办法查看状态,查看日志发现没有创建logs文件夹,如下

如果$ZK_INSTALL下不存在logs目录,也会报错。所以需要手动创建logs文件夹。

报错异常信息如下:

  1. 2012-02-26 00:06:47,364 [myid:] INFO  [main:QuorumPeerConfig@101Reading configuration from: ../conf/zoo3.cfg   
  2. 2012-02-26 00:06:47,372 [myid:] ERROR [main:QuorumPeerMain@85Invalid config, exiting abnormally   
  3. org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing ../conf/zoo3.cfg   
  4.         at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:121)   
  5.         at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:101)   
  6.         at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)   
  7. Caused by: [color=red]java.lang.IllegalArgumentExceptiondataLogDir /usr/local/zookeeper-3.4.3/logs is missing.[/color]   
  8.         at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:247)   
  9.         at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:117)   
  10.         ... 2 more   
  11. Invalid config, exiting abnormally 
可能会遇到的其他错误:
在linux下直接执行java命令,发现输出如下:

 

Bash代码  收藏代码
  1. [hadoop@hadoop-master bin]$ java  
  2. Usage: gij [OPTION] ... CLASS [ARGS] ...  
  3.           to invoke CLASS.main, or  
  4.        gij -jar [OPTION] ... JARFILE [ARGS] ...  
  5.           to execute jar file  
  6. Try `gij --help' for more information.  

 显然,zkServer.sh使用的java不正确。使用的gij的java。解决这个问题就简单了,把zkServer.sh脚本改成:

Bash代码  收藏代码
  1. $JAVA_HOME/bin/java  "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"  
  2.    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG"  

 

这样修改之后,就能正常运行了。


错误3:

启动正常没报错,但zkServer.sh status查看状态的时候却出现错误,如下:

 
JMX enabled by default
Using config: /hadoop/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.

jps查看进程,却发现进程已启动

7313  QuorumPeerMain

原以为是配置文件有问题,各种调式,尝试各种模式都不起作用!最后发现是nc版本的问题,

导致zkServer.sh status出错……各种无语!

解决方法:

打开zkServer.sh

找到

status)
    STAT=`echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode`

在nc与localhost之间加上 -q 1 (是数字1而不是字母l)
如果已存在则去掉

阅读(1257) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~