Hadoop2.2.0+HA+zookeeper3.4.5详细配置过程+错误处理(二)

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

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

       

        如有转载,请注意明出处!

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

测试启动

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

1、启动zookeeper

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

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">     <span style="font-size:12px;">23598 Jps           
  2.       22491 QuorumPeerMain </span></span>  

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">      <span style="font-size:12px;">tom@hadoop4:~yarn/hadoop2.2.0/app/zookeeper/bin$ ./zkServer.sh status  
  2.        JMX enabled by default  
  3.        Using config: /home/ericsson/zookeeper/bin/../conf/zoo.cfg  
  4.        Mode: follower  
  5.        tom@hadoop4:~yarn/hadoop2.2.0/app/zookeeper/bin$ </span></span>  

2、验证格式化zookeeper

2.1执行zkCli.sh

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">Welcome to ZooKeeper!  
  2. 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)  
  3. 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  
  4. JLine support is enabled  
  5. 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  
  6. WATCHER::  
  7. WatchedEvent state:SyncConnected type:None path:null  
  8. ls /  
  9. [zookeeper]  
  10. [zk: localhost:2181(CONNECTED) 1]   
  11. [zk: localhost:2181(CONNECTED) 1] </span>  

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

2.2 格式化ZooKeeper集群

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

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

       正常命令输出结尾:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">14/04/08 17:03:40 INFO ha.ActiveStandbyElector: Session connected.  
  2. 14/04/08 17:03:40 INFO zookeeper.ZooKeeper: Session: 0x545407c1d6c0003 closed  
  3. 14/04/08 17:03:40 INFO zookeeper.ClientCnxn: EventThread shut down</span>  

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

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

终端输出:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">14/04/08 17:03:40 INFO ha.ActiveStandbyElector: Session connected.  
  2. 14/04/08 17:03:40 INFO zookeeper.ZooKeeper: Session: 0x545407c1d6c0003 closed  
  3. 14/04/08 17:03:40 INFO zookeeper.ClientCnxn: EventThread shut down  
  4. Exception in thread "main" org.apache.hadoop.HadoopIllegalArgumentException: Bad argument: –formatZK  
  5.     at org.apache.hadoop.ha.ZKFailoverController.badArg(ZKFailoverController.java:245)  
  6.     at org.apache.hadoop.ha.ZKFailoverController.doRun(ZKFailoverController.java:208)  
  7.     at org.apache.hadoop.ha.ZKFailoverController.access$000(ZKFailoverController.java:59)  
  8.     at org.apache.hadoop.ha.ZKFailoverController$1.run(ZKFailoverController.java:166)  
  9.     at org.apache.hadoop.ha.ZKFailoverController$1.run(ZKFailoverController.java:162)  
  10.     at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:456)  
  11.     at org.apache.hadoop.ha.ZKFailoverController.run(ZKFailoverController.java:162)  
  12.     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成功,否则就出现问题:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. WATCHER::  
  2. WatchedEvent state:SyncConnected type:None path:null  
  3. ls /  
  4. [hadoop-ha,zookeeper]  
  5. [zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha       
  6. [cluster1]       
  7. [zk: localhost:2181(CONNECTED) 2]  

3启动JournalNode集群

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

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

      命令输出(hadoop1为例)

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">[tom@hadoop1 ~yarn/hadoop-2.2.0/]$ sbin/hadoop-daemon.sh start journalnode      
  2. starting journalnode, logging to yarn/hadoop-2.2.0/logs/hadoop-root-journalnode-hadoop101.out      
  3. [tom@hadoop1 ~yarn/hadoop-2.2.0/]$   </span>  

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

      验证(hadoop1为例)

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">[tom@hadoop1 hadoop]$ jps    
  2. 23396 JournalNode    
  3. 23598 Jps    
  4. 22491 QuorumPeerMain    
  5. [tom@hadoop1 hadoop]$</span>  

      查看一下目录结构:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">[tom@hadoop1 ~yarn/yarn_data/]$ pwd      
  2. /home/tom/yarn/yarn_data  
  3. [tom@hadoop1 ~yarn/yarn_data/]$ ls tmp/      
  4. journal      
  5. [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

      命令输出:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">  
  2. 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.       
  3. 14/04/08 17:39:40 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0       
  4. 14/04/08 17:39:40 INFO util.ExitUtil: Exiting with status 0       
  5. 14/04/08 17:39:40 INFO namenode.NameNode: SHUTDOWN_MSG:       
  6. /************************************************************       
  7. SHUTDOWN_MSG: Shutting down NameNode at hadoop1/172.16.128.134       
  8. ************************************************************/       
  9. [tom@hadoop1 ~yarn/hadoop-2.2.0/]$</span>  

      验证查看一下目录结构:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [tom@hadoop1 ~yarn/yarn_data]$ pwd      
  2. /home/tom/yarn/yarn_data  
  3. [tom@hadoop1 ~yarn/yarn_data]$ ls tmp/      
  4. dfs  journal      
  5. [tom@hadoop1 ~yarn/yarn_data]$ls dfs/  
  6.   
  7. name  

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

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

5、启动刚才格式化的namenode

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

      命令输出:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [tom@hadoop1 ~yarn/hadoop-2.2.0]$ sbin/hadoop-daemon.sh start namenode      
  2. starting namenode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-namenode-hadoop101.out  
  3.   
  4. 验证:  
  5. [tom@hadoop1 ~yarn/hadoop-2.2.0/]$ jps      
  6. 23396 JournalNode      
  7. 23598 Jps      
  8. 23558 NameNode      
  9. 22491 QuorumPeerMain      
  10. [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

      命令输出:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [tom@hadoop2 ~yarn/hadoop-2.2.0]$bin/hdfs namenode -bootstrapStandby      
  2. 14/04/08 17:49:20 INFO namenode.NameNode: STARTUP_MSG:      
  3. /************************************************************    
  4. ........  
  5.   
  6. 14/04/08 17:49:20 INFO util.ExitUtil: Exiting with status 0       
  7. 14/04/08 17:49:20 INFO namenode.NameNode: SHUTDOWN_MSG:       
  8. /************************************************************       
  9. SHUTDOWN_MSG: Shutting down NameNode at hadoop2/172.16.128.135        
  10. ************************************************************/       
  11. [tom@hadoo2 ~yarn/hadoop-2.2.0]$     
  12.   
  13. 验证:  
  14.   
  15. [tom@hadoop2 ~yarn/yarn_data]$ pwd      
  16. /home/tom/yarn/yarn_data  
  17. [tom@hadoop2 ~yarn/yarn_data]$ ls tmp/      
  18. dfs  journal      
  19. [tom@hadoop2 ~yarn/yarn_data]$ls dfs/  
  20.   
  21. name  

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

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

7、启动hadoop2中另一个Namenode

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

       命令输出:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [tom@hadoop2 ~yarn/hadoop-2.2.0]$ sbin/hadoop-daemon.sh start namenode      
  2. starting namenode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-namenode-hadoop101.out  
  3. 验证:  
  4.   
  5. [tom@hadoop2 ~yarn/hadoop-2.2.0/]$ jps      
  6. 2336 JournalNode      
  7. 2358 Jps      
  8. 2358 NameNode      
  9. 2241 QuorumPeerMain      
  10. [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

      命令输出:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">  
  2. [tom@hadoop2 ~yarn/hadoop-2.2.0]$sbin/hadoop-daemons.sh start datanode      
  3. hadoop3: starting datanode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-datanode-hadoop3.out      
  4. hadoop4: starting datanode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-datanode-hadoop4.out      
  5. hadoop5: starting datanode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-datanode-hadoop5.out      
  6. hadoop6: starting datanode, logging to /home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-datanode-hadoop6.out      
  7. [tom@hadoop2 ~yarn/hadoop-2.2.0]$</span>  

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

      验证(以hadoop1为例):

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">  
  2. [tom@hadoop2 ~yarn/hadoop-2.2.0]$ jps      
  3. 23396 JournalNode      
  4. 24302 Jps      
  5. 23558 NameNode      
  6. 22491 QuorumPeerMain      
  7. [tom@hadoop2 ~yarn/hadoop-2.2.0]$</span>  

     【可以看到java进程DataNode,这个时候可以ssh进入datanode机器,jps,查看datanode是否启动进程,这里的3-6节点,datanode都是可以起来的】    

9启动Yarn

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

      命令输出:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [tom@hadoop1 ~yarn/hadoop-2.2.0]$sbin/start-yarn.sh      
  2. starting yarn daemons      
  3. starting resourcemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-resourcemanager-hadoop1.out      
  4. Hadoop6: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop6.out      
  5. hadoop5: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop5.out      
  6. hadoop4: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop4.out      
  7. hadoop3: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop3.out      
  8. hadoop2: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop2.out      
  9. hadoop1: starting nodemanager, logging to /home/tom/yarn/hadoop-2.2.0/logs/yarn-root-nodemanager-hadoop1.out      
  10. [tom@hadoop1 ~yarn/hadoop-2.2.0]$  
  11.   
  12. 验证:  
  13.   
  14. [tom@hadoop1 ~yarn/hadoop-2.2.0]$jps      
  15. 23396 JournalNode      
  16. 25154 ResourceManager      
  17. 25247 NodeManager        
  18. 23558 NameNode      
  19. 22491 QuorumPeerMain      
  20. 25281 Jps      
  21. [tom@hadoop1 ~yarn/hadoop-2.2.0]$  

      【产生java进程ResourceManagerNodeManager

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

10启动ZooKeeperFailoverCotroller

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

       命令输出(以hadoop1为例):

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [tom@hadoop1 ~yarn/hadoop-2.2.0]$ sbin/hadoop-daemon.sh start zkfc      
  2. starting zkfc, logging to 、home/tom/yarn/hadoop-2.2.0/logs/hadoop-root-zkfc-hadoop101.out      
  3. [tom@hadoop1 ~yarn/hadoop-2.2.0]$验证(以hadoop1为例):  
  4.   
  5. [tom@hadoop1 ~yarn/hadoop-2.2.0]$ jps      
  6. 24599 DFSZKFailoverController      
  7. 23396 JournalNode      
  8. 24232 DataNode      
  9. 23558 NameNode      
  10. 22491 QuorumPeerMain      
  11. 24654 Jps      
  12. [tom@hadoop1 ~yarn/hadoop-2.2.0]$  

      【产生java进程DFSZKFailoverController

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

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

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

       23558 NameNode  

然后jps:nemenode进程不存在了

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:12px;">  
  2. [tom@hadoop1 ~yarn/hadoop-2.2.0]$ jps      
  3. 24599 DFSZKFailoverController      
  4. 23396 JournalNode      
  5. 24232 DataNode      
  6. 22491 QuorumPeerMain      
  7. 24654 Jps </span>  

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

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

 总结:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop、Hive、Spark和Zookeeper都是大数据技术栈中重要的组件。 Hadoop是一个由Apache开源的分布式文件系统和计算框架。它能够将大规模的数据分散存储在千台、万台、甚至更多的服务器上,并且实现数据的高效处理和分析。 Hive是在Hadoop之上构建的数据仓库基础设施。它提供了一个类似于SQL的查询语言,可以让用户通过简单的查询语句对存储在Hadoop集群中的数据进行操作和分析。Hive可以将结构化和半结构化的数据映射为一张表格,并提供了诸如过滤、连接、聚合等功能。 Spark是一个快速的、通用的集群计算系统。它提供了分布式数据处理的能力,采用了内存计算方式,相比于Hadoop MapReduce带来了更高的性能和更广泛的应用场景。Spark支持多种编程语言和丰富的组件库,如Spark SQL、Spark Streaming等,可以用于数据处理、机器学习、图计算等任务。 Zookeeper是一个开源的分布式协调服务。它实现了一个分布式的、高可用的、高性能的协调系统,可以提供诸如统一命名服务、配置管理、分布式锁等功能。Zookeeper能够帮助大数据系统中的不同组件进行协调和通信,确保分布式系统的一致性和可靠性。 综上所述,Hadoop用于分布式存储和计算,Hive用于数据仓库和查询分析,Spark用于高性能的集群计算,而Zookeeper用于分布式协调和通信。这四个技术在大数据领域中扮演着不可替代的角色,相辅相成,共同构建了现代大数据生态系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值