Home  >  Article  >  Database  >  Hadoop2.2.0稳定版整合ZooKeeper(2)

Hadoop2.2.0稳定版整合ZooKeeper(2)

WBOY
WBOYOriginal
2016-06-07 15:07:401333browse

hadoop学习(九)Hadoop2.2.0HAzookeeper3.4.5详细配置过程错误处理(2) Hadoop2.2.0HAzookeeper3.4.5详细配置过程体系结构错误处理(2) 这篇文章,主要是针对zookeeper和hadoop集群的整体测试,以及自己在实际过程遇到的问题和解决思路。 整个过程是,痛苦、无

hadoop学习(九)Hadoop2.2.0+HA+zookeeper3.4.5详细配置过程+错误处理(2)

       Hadoop2.2.0+HA+zookeeper3.4.5详细配置过程+体系结构+错误处理(2)

       这篇文章,主要是针对zookeeper和hadoop集群的整体测试,以及自己在实际过程遇到的问题和解决思路。     

        整个过程是,痛苦、无奈和纠结的。伴随着N多夜晚。总结的过程就超过10个小时。还有很多问题都没有写完,后续会继续跟近,也欢迎与读者讨论交谈。

        读者有益,写着有劳。关爱身边每一个人,热爱身体,珍惜生命,且行且珍惜。

        http://blog.csdn.net/yczws1/article/details/23594149

测试启动

       按照下面的每一步执行,执行完一定要看输出的信息,注意warnerrorfatal的情况。因为这都是可能是问题出现的地方。出现一个问题,不解决,可能就会影响接下来的测试。这才是真正的工作量。

1、启动zookeeper

       在hadoop1hadoop2hadoop3、hadoop4、hadoop5上zookeeper目录下分别执行命令:bin/zkServer.sh start

       在每一台机器执行完上面的命令后,执行jps,会显示:这是初步认定启动没有问题

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word;">     
     <span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">23598 Jps         
      22491 QuorumPeerMain </span></span>

       当所有机器执行上述命令完毕后,再在每台机器上执行:bin/zkServer.sh status 查看每台机器zookeeper的状态,正确的话,只有一台机器是leader,其余机器都是显示folower1-5台机器都需要测试一下,效果如下:

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word;">      
      <span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">tom@hadoop4:~yarn/hadoop2.2.0/app/zookeeper/bin$ ./zkServer.sh status
       JMX enabled by default
       Using config: /home/ericsson/zookeeper/bin/../conf/zoo.cfg
       Mode: follower
       tom@hadoop4:~yarn/hadoop2.2.0/app/zookeeper/bin$ </span></span>

2、验证格式化zookeeper

2.1执行zkCli.sh

        在hadoop1机器上,hadoop目录,执行zkCli.sh 终端上会输出一连串的信息。最后结束的信息是

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
Welcome to ZooKeeper!
2014-04-08 16:44:40,028 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@966] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2014-04-08 16:44:40,033 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@849] - Socket connection established to localhost/127.0.0.1:2181, initiating session
JLine support is enabled
2014-04-08 16:44:40,094 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1207] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x145407bbc720004, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] 
[zk: localhost:2181(CONNECTED) 1] </span>

      【可以看到ZK集群 中只有一个节点zookeeper

2.2 格式化ZooKeeper集群

       格式化zookeeper集群,目的是在ZooKeeper集群上建立HA的相应节点

       在hadoop1上的hadoop的目录执行:bin/hdfs zkfc –formatZK

       正常命令输出结尾:

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
14/04/08 17:03:40 INFO ha.ActiveStandbyElector: Session connected.
14/04/08 17:03:40 INFO zookeeper.ZooKeeper: Session: 0x545407c1d6c0003 closed
14/04/08 17:03:40 INFO zookeeper.ClientCnxn: EventThread shut down</span>

       如果终端输出是以上面结尾,应该是没有出现问题。

       而我在执行的时候,遇到一个问题:在出现上面类似代码之后,报了一个异常,导致后面的执行没有结果,问题就出在这个异常的之上。

终端输出:

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
14/04/08 17:03:40 INFO ha.ActiveStandbyElector: Session connected.
14/04/08 17:03:40 INFO zookeeper.ZooKeeper: Session: 0x545407c1d6c0003 closed
14/04/08 17:03:40 INFO zookeeper.ClientCnxn: EventThread shut down
Exception in thread "main" org.apache.hadoop.HadoopIllegalArgumentException: Bad argument: –formatZK
    at org.apache.hadoop.ha.ZKFailoverController.badArg(ZKFailoverController.java:245)
    at org.apache.hadoop.ha.ZKFailoverController.doRun(ZKFailoverController.java:208)
    at org.apache.hadoop.ha.ZKFailoverController.access$000(ZKFailoverController.java:59)
    at org.apache.hadoop.ha.ZKFailoverController$1.run(ZKFailoverController.java:166)
    at org.apache.hadoop.ha.ZKFailoverController$1.run(ZKFailoverController.java:162)
    at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:456)
    at org.apache.hadoop.ha.ZKFailoverController.run(ZKFailoverController.java:162)
    at org.apache.hadoop.hdfs.tools.DFSZKFailoverController.main(DFSZKFailoverController.java:175)</span>

        就是上面的异常,没有解决,导致下面的问题都不能进行,因为下面要在执行zkCli.sh,查看zookeeper有没有格式化成功,生成集群名称。自己也咨询了几个老师,他们给的回复也是不知所云。自己在这上面,也是耽误了很长时间,不知道到底问题出现在哪儿。其中有一个回复是:可能是 -formatZK声明有问题。字面解释是这样,但是formatZK的声明是没有问题。耽误了几天,在网上得到一个解决方案。Zookeeper日志的问题,因为zookeeper是不能自动清理日志的。因为事先,我在装zookeeper的时候,装过两次,但是对应的datalog目录数据没有更改,导致在执行formatZK命令的时候报错。

        我把log日志删除掉,重新建立一个文件,最后问题解决。因为这个原因,自己也查了关于zookeeper的相关信息。这里只谈到zookeeper日志的问题,后续的话,我们更多的去谈zookeeper的相关内容。因为zookeeper的架构理念很重要。

        在使用zookeeper过程中,我们知道,会有dataLog两个目录,分别用于snapshot和事务日志的输出(默认情况下只有data目录,snapshot和事务日志都保存在这个目录中,关于这两个目录的详细说明,请看《ZooKeeper管理员指南》)。

        正常运行过程中,ZK会不断地把快照数据和事务日志输出到这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的,需要管理员来清理,这里介绍4种清理日志的方法。在这4种方法中,推荐使用第一种方法,对于运维人员来说,将日志清理工作独立出来,便于统一管理也更可控。毕竟zk自带的一些工 具并不怎么给力,这里是社区反映的两个问题:这里可以参考:ZooKeepr日志清理 的4种方法:这里不多介绍。

       验证:

       执行:zkCli.sh

       输出和上面执行zkCli.sh输出的内容相似。如果输出下面内容,则证明格式化zookeeper成功,否则就出现问题:

WATCHER::
WatchedEvent state:SyncConnected type:None path:null
ls /
[hadoop-ha,zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha     
[cluster1]     
[zk: localhost:2181(CONNECTED) 2]

3启动JournalNode集群

      在hadoop1、hadoop2hadoop3、hadoop4、hadoop5上分别hadoop目录

      执行命令:sbin/hadoop-daemon.sh start journalnode

      命令输出(hadoop1为例)

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
[tom@hadoop1 ~yarn/hadoop-2.2.0/]$ sbin/hadoop-daemon.sh start journalnode    
starting journalnode, logging to yarn/hadoop-2.2.0/logs/hadoop-root-journalnode-hadoop101.out    
[tom@hadoop1 ~yarn/hadoop-2.2.0/]$   </span>

      在每个节点执行完启动命令后,每个节点都执行以下验证。

      验证(hadoop1为例)

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
[tom@hadoop1 hadoop]$ jps  
23396 JournalNode  
23598 Jps  
22491 QuorumPeerMain  
[tom@hadoop1 hadoop]$</span>

      查看一下目录结构:

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
[tom@hadoop1 ~yarn/yarn_data/]$ pwd    
/home/tom/yarn/yarn_data
[tom@hadoop1 ~yarn/yarn_data/]$ ls tmp/    
journal    
[tom@hadoop1 ~yarn/yarn_data/]$</span>

     【启动JournalNode后,会在本地磁盘产生一个目录,用户保存NameNodeedits文件的数据】

4、格式化集群的一个NameNode

     从hadoop1hadoop2中任选一个即可,这里选择的是hadoop1

     在hadoop1/home/tom/yarn/hadoop-2.2.0/目录下执行下面命令:

     bin/hdfs namenode -format -clusterId c1

      命令输出:

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
14/04/08 17:39:40 INFO namenode.FSImage: Image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 196 bytes saved in 0 seconds.     
14/04/08 17:39:40 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0     
14/04/08 17:39:40 INFO util.ExitUtil: Exiting with status 0     
14/04/08 17:39:40 INFO namenode.NameNode: SHUTDOWN_MSG:     
/************************************************************     
SHUTDOWN_MSG: Shutting down NameNode at hadoop1/172.16.128.134     
************************************************************/     
[tom@hadoop1 ~yarn/hadoop-2.2.0/]$</span>

      验证查看一下目录结构:

[tom@hadoop1 ~yarn/yarn_data]$ pwd    
/home/tom/yarn/yarn_data
[tom@hadoop1 ~yarn/yarn_data]$ ls tmp/    
dfs  journal    
[tom@hadoop1 ~yarn/yarn_data]$ls dfs/

name

     【格式化NameNode会在磁盘产生一个目录,用于保存NameNodefsimageedits等文件】   

      出现上面内容,则认为,格式化namenode成功。

5、启动刚才格式化的namenode

      在hadoop1/home/tom/yarn/hadoop-2.2.0/目录下执行命令:/sbin/hadoop-daemon.sh start namenode

      命令输出:

[tom@hadoop1 ~yarn/hadoop-2.2.0]$ sbin/hadoop-daemon.sh start namenode    
starting namenode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-namenode-hadoop101.out

验证:
[tom@hadoop1 ~yarn/hadoop-2.2.0/]$ jps    
23396 JournalNode    
23598 Jps    
23558 NameNode    
22491 QuorumPeerMain    
[tom@hadoop1 ~yarn/hadoop-2.2.0/]$

        在页面输入地址:hadoop1:50070/dfshealth.jsp,你可以在页面看到namenode1的状态,是standby

6、把NameNode1的数据从hadoop1同步到hadoop2

      在hadoop2home/tom/yarn/hadoop-2.2.0/目录上

      执行命令:

      bin/hdfs namenode –bootstrapStandby

      命令输出:

[tom@hadoop2 ~yarn/hadoop-2.2.0]$bin/hdfs namenode -bootstrapStandby    
14/04/08 17:49:20 INFO namenode.NameNode: STARTUP_MSG:    
/************************************************************  
........

14/04/08 17:49:20 INFO util.ExitUtil: Exiting with status 0     
14/04/08 17:49:20 INFO namenode.NameNode: SHUTDOWN_MSG:     
/************************************************************     
SHUTDOWN_MSG: Shutting down NameNode at hadoop2/172.16.128.135      
************************************************************/     
[tom@hadoo2 ~yarn/hadoop-2.2.0]$   

验证:

[tom@hadoop2 ~yarn/yarn_data]$ pwd    
/home/tom/yarn/yarn_data
[tom@hadoop2 ~yarn/yarn_data]$ ls tmp/    
dfs  journal    
[tom@hadoop2 ~yarn/yarn_data]$ls dfs/

name

      【在tmp目录下产生一个目录name】 

       如果出现上面结果,证明数据从namenode1上同步到namenode2上是成功的。如果可以出现上面结果,继续下面的步骤。如果没有出现dfs目录,也同样执行下面的过程,不过两者产生的结果不一样。

7、启动hadoop2中另一个Namenode

      在hadoop2上/home/tom/yarn/hadoop-2.2.0/目录下执行命令:/sbin/hadoop-daemon.sh start namenode

       命令输出:

[tom@hadoop2 ~yarn/hadoop-2.2.0]$ sbin/hadoop-daemon.sh start namenode    
starting namenode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-namenode-hadoop101.out
验证:

[tom@hadoop2 ~yarn/hadoop-2.2.0/]$ jps    
2336 JournalNode    
2358 Jps    
2358 NameNode    
2241 QuorumPeerMain    
[tom@hadoop2 ~yarn/hadoop-2.2.0/]$

      在页面地址输入:hadoop2:50070/dfshealth.jsp你就可以看到namenode2的状态效果。和namenode1一样,同样是standby状态。

      不好的事情,我测试的过程就没有出现上面的结果,namenode进程没有启动。这个问题,也是卡在那儿不得已解决,耽误很长时间。问题,就出现在67两个步骤上。不知道怎么解决,后来咨询一个哥们,那哥们把在

http://hadoop.apache.org/docs/r2.3.0/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html

       上给我截了一个图,我仔细看了关于第6步的过程。其实就是为了把namenode1上格式化产生的目录,拷贝到namenode2中,既然执行6没有出现我想要的结果。那就直接把namenode1中目中的dfs目录直接复制到namenode2中不就OK了吗?事实证明正式如此,官网也是这么说明的。复制完毕,再在namenode2上执行第7步,jps就可以看到namenode起来的进程了。至此这个问题解决了。

8、启动所有的datanode

      Datanode是在slaves文件中配置的。在hadoop1上执行:

      sbin/hadoop-daemons.sh start datanode

      命令输出:

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
[tom@hadoop2 ~yarn/hadoop-2.2.0]$sbin/hadoop-daemons.sh start datanode    
hadoop3: starting datanode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-datanode-hadoop3.out    
hadoop4: starting datanode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-datanode-hadoop4.out    
hadoop5: starting datanode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-datanode-hadoop5.out    
hadoop6: starting datanode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-datanode-hadoop6.out    
[tom@hadoop2 ~yarn/hadoop-2.2.0]$</span>

     【上述命令会在四个节点分别启动DataNode进程】

      验证(以hadoop1为例):

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
[tom@hadoop2 ~yarn/hadoop-2.2.0]$ jps    
23396 JournalNode    
24302 Jps    
24232 DataNode    
23558 NameNode    
22491 QuorumPeerMain    
[tom@hadoop2 ~yarn/hadoop-2.2.0]$</span>

     【可以看到java进程DataNode】    

9启动Yarn

      在hadoop1上执行命令:sbin/start-yarn.sh

      命令输出:

[tom@hadoop1 ~yarn/hadoop-2.2.0]$sbin/start-yarn.sh    
starting yarn daemons    
starting resourcemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-resourcemanager-hadoop1.out    
Hadoop6: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop6.out    
hadoop5: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop5.out    
hadoop4: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop4.out    
hadoop3: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop3.out    
hadoop2: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop2.out    
hadoop1: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop1.out    
[tom@hadoop1 ~yarn/hadoop-2.2.0]$

验证:

[tom@hadoop1 ~yarn/hadoop-2.2.0]$jps    
23396 JournalNode    
25154 ResourceManager    
25247 NodeManager    
24232 DataNode    
23558 NameNode    
22491 QuorumPeerMain    
25281 Jps    
[tom@hadoop1 ~yarn/hadoop-2.2.0]$

      【产生java进程ResourceManagerNodeManager

       也可以通过浏览器访问hadoop1:8088/cluster

10启动ZooKeeperFailoverCotroller

       在hadoop1hadoop2hadoop3hadoop4hadoop5、hadoop6上分别执行命令: sbin/hadoop-daemon.sh start zkfc

       命令输出(以hadoop1为例):

[tom@hadoop1 ~yarn/hadoop-2.2.0]$ sbin/hadoop-daemon.sh start zkfc    
starting zkfc, logging to 、home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-zkfc-hadoop101.out    
[tom@hadoop1 ~yarn/hadoop-2.2.0]$验证(以hadoop1为例):

[tom@hadoop1 ~yarn/hadoop-2.2.0]$ jps    
24599 DFSZKFailoverController    
23396 JournalNode    
24232 DataNode    
23558 NameNode    
22491 QuorumPeerMain    
24654 Jps    
[tom@hadoop1 ~yarn/hadoop-2.2.0]$

      【产生java进程DFSZKFailoverController

11、验证HA的故障自动转移是否好用

       在执行完第10步的时候,在页面可以观察到两个NameNode的状态,hadoop1的状态是standbyhadoop102的状态是active。原先两个namenode都是standby的状态。

       在hadoop1上我们执行:kill -9 23558

       23558 NameNode  

然后jps:nemenode进程不存在了

<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word; font-size: 12px;">
[tom@hadoop1 ~yarn/hadoop-2.2.0]$ jps    
24599 DFSZKFailoverController    
23396 JournalNode    
24232 DataNode    
22491 QuorumPeerMain    
24654 Jps </span>

        然后刷新两个页面,可以看到,两台机器的状态置换了。原先的active变成standby,原先的standby变成active,这说明,HA故障自动转换是正常的,HDFS是高可用的。

        等你顺利结束上面所有的步骤,都很顺利的话,说明,你集群搭建基本完成任务。说是基本,因为还有事情要做,就是,你要开始上传文件开始测试程序,看看hadoop是否应用正常。这就是接下来要做的事情了。

 总结:

        整个过程是,痛苦、无奈和纠结的。伴随着N多夜晚。总结的过程就超过10个小时。还有很多问题都没有写完,后续会继续跟近,也欢迎与读者讨论交谈。

        读者有益,写着有劳。关爱身边每一个人,热爱身体,珍惜生命,且行且珍惜。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn