[关闭]
@songlaf 2016-05-08T17:42:38.000000Z 字数 20341 阅读 714

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

Hadoop

前言

   本文主要通过对hadoop2.2.0集群配置的过程加以梳理,所有的步骤都是通过自己实际测试。文档的结构也是根据自己的实际情况而定,同时也会加入自己在实际过程遇到的问题。搭建环境过程不重要,重要点在于搭建过程中遇到的问题,解决问题的过程。

   可能自己遇到的问题在一些由经验的老者手上都不是问题,但是这些问题着实让自己耽误了很长时间,最后问题解决也是费了太大心血。也通过这篇文档,表现出来,算是总结,为后者提供意见。

Hadoop2.2.0体系结构

   要想理解本节内容,首先需要了解hadoop1的体系结构。这里不过多的介绍基于hadoop1的体系架构,早在之前,曾搭建hadoop1.2.1伪分布式集群,详细请看Hadoop学习(一)hadoop-1.2.1伪分布式配置及遇到的问题。这里主要介绍hadoop2的体系架构。

    hadoop1的核心组成是两部分,即HDFS和MapReduce。在hadoop2中变为HDFS和Yarn。

    新的HDFS中的NameNode不再是只有一个了,可以有多个(目前只支持2个)。每一个都有相同的职能。

    这两个NameNode的地位如何:一个是active状态的,一个是standby状态的。当 集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态 NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为 active状态的,就可以继续工作了。这就是高可靠。

    当NameNode发生故障时,他们的数据如何保持一致:在这里,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,JournalNode集群或者NFS进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,我们这里使用JournalNode集群进行数据共享。

    如何实现NameNode的自动切换:这就需要使用ZooKeeper集群进行选择了。HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。

    HDFS Federation(HDFS联盟):联盟的出现是有原因的。我们知道 NameNode是核心节点,维护着整个HDFS中的元数据信息,那么其容量是有限的,受制于服务器的内存空间。当NameNode服务器的内存装不下数据后,那么HDFS集群就装不下数据了,寿命也就到头了。因此其扩展性是受限的。HDFS联盟指的是有多个HDFS集群同时工作,那么其容量理论上就不受限了,夸张点说就是无限扩展。你可以理解成,一个总集群中,可以虚拟出两个或两个以上的单独的小集群,各个小集群之间数据是实时共享的。因为hadoop集群中已经不在单独存在namenode和datanode的概念。当一个其中一个小集群出故障,可以启动另一个小集群中的namenode节点,继续工作。因为数据是实时共享,即使namenode或datanode一起死掉,也不会影响整个集群的正常工作。

集群节点任务安排:

    这点很重要,我们事先一定要先理解,节点之间任务是如何安排的。如果事先不理解为什么是这样,后面还会遇到更多的问题。这就需要,理解journalnode、zookeeper、datanode、namenode之间关系。自己也是在这上面耽误了很长时间,希望读者这点多注意下。

    6台主机。

    Journalnode和zookeeper保持奇数点,这点大家要有个概念,最少不少于3个节点。这里暂不讲解。

    两个namenode上面已经说明,其实在hadoop2中几点之间namenode和datanode之间的划分已经不是那么明确了。这只是采用后4台机器作为namenode。这里也存在一个问题:如果把datanode和namenode放在一起,对数据的读取IO的效率肯定会有一定的影响,不同机器之间还是要通过网线和http请求完成数据之间的共享。实际中,两者是可以在一起。但是我不知道在一起和不在一起之间的主要区别在哪儿,上面的解释只是个人意见,如果读者有更好的意见可以留言,大家一起讨论。

   在集群搭建之间,各主机设置静态IP、更改主机名称、主机之间ssh互联等相关设置这里不在多讲。如有需要,请参考:hadoop学习(五)Hadoop2.2.0完全分布式安装详解(1)配置文档。

一)安装过程一

   下面所有的过程都是在hadoop1机器上完成的,之后把文件复制到其他节点中。

Zookeeper安装过程:
1、下载解压zookeeper

   下载地址:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.5/

   解压到指定目录:这里目录:/home/tom/yarn/hadoop-2.2.0/app/

   在hadoop目录中创建app目录。把文件解压到hadoop的app目录中,是为了以后整个项目可以整体移植。包括后面,我们会安装HBase、Hive等软件,都是解压到app的目录中。

2、修改配置文件
2.1进入zookeeper中conf目录:

   拷贝命名zoo_sample.cfg 为zoo.cfg。我们一般不修改配置文件默认的示例文件,修改赋值其子文件。

   编辑zoo.cfg

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

tickTime=2000  
initLimit=10  
syncLimit=5  
dataDir=/home/tom/yarn/hadoop-2.2.0/app/zookeeper-3.4.5/zkdata  
dataLogDir=/home/tom/yarn/hadoop-2.2.0/app/zookeeper-3.4.5/zkdatalog  
clientPort=2181  
server.1=hadoop1:2888:3888  
server.2=hadoop2:2888:3888   
server.3=hadoop3:2888:3888  
server.4=hadoop4:2888:3888  
server.5=hadoop5:2888:3888  

2.2创建zkdata和zkdatalog两个文件夹

   在zookeeper的目录中,创建上述两个文件夹。进入zkdata文件夹,创建文件myid,填入1。这里写入的1,是在zoo.cfg文本中的server.1中的1。当我们把所有文件都配置完毕,我们把hadoop1中yarn目录复制到其它机器中,我们在修改每台机器中对应的myid文本,hadoop2中的myid写入2。其余节点,安照上面配置,依此写入相应的数字。Zkdatalog文件夹,是为了指定zookeeper产生日志指定相应的路径。

3、添加环境变量

   本机环境变量添是在/etc/profile目录中添加的。

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

export ZOOKEEPER_HOME=/home/tom/yarn/hadoop-2.2.0/app/zookeeper-3.4.5  
PATH=$ZOOKEEPER_HOME/bin:$PATH  

    添加ZOOKEEPER_HOME/bin目录可以在原有的PATH后面加入

    :$ZOOKEEPER_HOME/bin

    关于环境变量修改/etc目录下的profile文件,也可以在根目录下的.bashrc目录下添加环境变量。这两者有什么区别:.bashrc是对当前目录用户的环境变量,profile文件是对所有用户都开放的目录。当系统加载文件中,先从profile找相应的路劲,如果没有会在.bashrc文件中找对应的环境变量路径。这两者大家稍至了解。

    然后 source /etc/profile

   上面3个步骤就安装zookeeper完毕。然后就是测试zookeeper,这个放到后面等hadoop1上整体配置完毕,scp到其它主机上后,再一起测试。

Hadoop配置
1、下载解压hadoop2.2.0

    路径:http://apache.dataguru.cn/hadoop/common/hadoop-2.2.0/

   解压到:/home/tom/yarn/下。其实这一步应该在解压zookeeper之前。不再多讲。

2、修改配置文件

    这里要修改配置文件一共包括6个,分别是在hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、 yarn-site.xml和slaves。

    修改文件的目录地址:/home/tom/yarn/hadoop-2.2.0/etc/hadoop/

2.1文件hadoop-env.sh

    添加jdk环境变量:

    export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45

2.2文件coer-site.xml

  1. <configuration>
  2. <property>
  3. <name>fs.defaultFS</name>
  4. <value>hdfs://cluster1</value>
  5. </property>
  6. <!--这里的值指的是默认的HDFS路径。这里只有一个HDFS集群,在这里指定!该值来自于hdfs-site.xml中的配置-->
  7. <property>
  8. <name>hadoop.tmp.dir</name>
  9. <value>/home/tom/yarn/yarn_data/tmp</value>
  10. </property>
  11. <!--这里的路径默认是NameNode、DataNode、JournalNode等存放数据的公共目录。用户也可以自己单独指定这三类节点的目录。这里的yarn_data/tmp目录与文件都是自己创建的-->
  12. <property>
  13. <name>ha.zookeeper.quorum</name>
  14. <value>hadoop1:2181,hadoop2:2181,hadoop3:2181,hadoop4:2181,hadoop5:2181</value>
  15. </property>
  16. <!--这里是ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点-->
  17. </configuration>

2.3文件hdfs-site.xml

  1. <configuration>
  2. <property>
  3. <name>dfs.replication</name>
  4. <value>2</value>
  5. </property>
  6. <!--指定DataNode存储block的副本数量。默认值是3个,我们现在有4个DataNode,该值不大于4即可。-->
  7. <property>
  8. <name>dfs.permissions</name>
  9. <value>false</value>
  10. </property>
  11. <property>
  12. <name>dfs.permissions.enabled</name>
  13. <value>false</value>
  14. </property>
  15. <property>
  16. <name>dfs.nameservices</name>
  17. <value>cluster1</value>
  18. </property>
  19. <!--给hdfs集群起名字-->
  20. <property>
  21. <name>dfs.ha.namenodes.cluster1</name>
  22. <value>hadoop1,hadoop2</value>
  23. </property>
  24. <!--指定NameService是cluster1时的namenode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可-->
  25. <property>
  26. <name>dfs.namenode.rpc-address.cluster1.hadoop1</name>
  27. <value>hadoop1:9000</value>
  28. </property>
  29. <!--指定hadoop101的RPC地址,一个是给client对应配置-->
  30. <property>
  31. <name>dfs.namenode.http-address.cluster1.hadoop1</name>
  32. <value>hadoop1:50070</value>
  33. </property>
  34. <!--指定hadoop101的http地址-->
  35. <property>
  36. <name>dfs.namenode.rpc-address.cluster1.hadoop2</name>
  37. <value>hadoop2:9000</value>
  38. </property>
  39. <property>
  40. <name>dfs.namenode.http-address.cluster1.hadoop2</name>
  41. <value>hadoop2:50070</value>
  42. </property>
  43. <property>
  44. <name>dfs.namenode.servicerpc-address.cluster1.hadoop1</name>
  45. <value>hadoop1:53310</value>
  46. <!--指定hadoop101的RPC地址,一个端口是提供给datanode对应配置-->
  47. </property>
  48. <property>
  49. <name>dfs.namenode.servicerpc-address.cluster1.hadoop2</name>
  50. <value>hadoop2:53310</value>
  51. </property>
  52. <property>
  53. <name>dfs.ha.automatic-failover.enabled.cluster1</name>
  54. <value>true</value>
  55. </property>
  56. <!--指定cluster1是否启动自动故障恢复,即当NameNode出故障时,是否自动切换到另一台NameNode-->
  57. <!--指定JournalNode -->
  58. <property>
  59. <name>dfs.namenode.shared.edits.dir</name>
  60. <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485;hadoop4:8485;hadoop5:8485/cluster1</value>
  61. </property>
  62. <!--指定cluster1的两个NameNode共享edits文件目录时,使用的JournalNode集群信息-->
  63. <property>
  64. <name>dfs.client.failover.proxy.provider.cluster1</name>
  65. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  66. </property>
  67. <!--指定cluster1出故障时,哪个实现类负责执行故障切换-->
  68. <property>
  69. <name>dfs.journalnode.edits.dir</name>
  70. <value>/home/tom/yarn/yarn_data/tmp/journal</value>
  71. </property>
  72. <!--指定JournalNode集群在对NameNode的目录进行共享时,自己存储数据的磁盘路径。tmp路径是自己创建,journal是启动journalnode自动生成-->
  73. <property>
  74. <name>dfs.ha.fencing.methods</name>
  75. <value>sshfence</value>
  76. </property>
  77. <!--一旦需要NameNode切换,使用ssh方式进行操作-->
  78. <property>
  79. <name>dfs.ha.fencing.ssh.private-key-files</name>
  80. <value>/home/tom/.ssh/id_rsa</value>
  81. </property>
  82. <!--如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置-->
  83. <property>
  84. <name>dfs.ha.fencing.ssh.connect-timeout</name>
  85. <value>10000</value>
  86. </property>
  87. <property>
  88. <name>dfs.namenode.handler.count</name>
  89. <value>100</value>
  90. </property>
  91. </configuration>

2.4文件mapred-site.xml

  1. <configuration>
  2. <property>
  3. <name>mapreduce.framework.name</name>
  4. <value>yarn</value>
  5. </property>
  6. </configuration>
  7. <!--指定运行mapreduce的环境是yarn,与hadoop1不同的地方-->

2.5文件yarn-site.xml

  1. <configuration>
  2. <property>
  3. <name>yarn.resourcemanager.hostname</name>
  4. <value>hadoop1</value>
  5. </property>
  6. <!--自定义ResourceManager的地址,还是单点-->
  7. <property>
  8. <name>yarn.nodemanager.aux-services</name>
  9. <value>mapreduce.shuffle</value>
  10. </property>
  11. </configuration>

2.6文件slaves
添加:这里指定哪台机器是datanode,这里指定4台机器。你甚至可以把集群所有机器都当做datanode

  1. hadoop3
  2. hadoop4
  3. hadoop5
  4. hadoop6

3、添加环境变量
环境变量的添加方法大都相同。这里给出我所有环境变量配置,大家可以根据自己的需要参考一下。

  1. JAVA_HOME=/usr/lib/jvm/jdk1.7.0_51
  2. export PATH=$PATH:$JAVA_HOME/bin
  3. export HBASE_HOME=/home/tom/hadoop-2.2.0/app/hbase-0.94.6-cdh4.4.0
  4. export HIVE_HOME=/home/tom/hadoop-2.2.0/app/hive-0.12.0/
  5. export HADOOP_HOME=/home/tom/hadoop-2.2.0
  6. export PATH=$PATH:$HBASE_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  7. export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
  8. export ZOOKEEPER_HOME=/home/tom/yarn/hadoop-2.2.0/app/zookeeper-3.4.5
  9. export PATH=$PATH:$ZOOKEEPER_HOME/bin

4、复制到其它节点
在hadoop的的根目录下(即:/home/tom目录下):因为我们所有的环境都装载在hadoop1的tom目录下。
执行:

  1. scp -r yarn hadoop2:/home/tom
  2. scp -r yarn hadoop3:/home/tom
  3. scp -r yarn hadoop4:/home/tom
  4. scp -r yarn hadoop5:/home/tom
  5. scp -r yarn hadoop6:/home/tom

注意点:
1、因为我们是把整个yarn目录复制到其他节点中,zookeeper也包含在内。事先我们定义zookeeper是在1-5台机器上部署。这里我们虽然把zookeeper拷贝到6机器中,但是我们再zookeeper配置文件中没有配置6机器的节点,在启动zookeeper的时候,6机器也不需要启动。
2、现在要做的是进入zookeeper目录下的zkdata目录,修改myid文件:各个myid内容对应zoo.cfg文件中server对应的编号。
按照上面的3个大步骤,以及在注释中自己要创建的文件夹,指定相应的路径之后,整体的hadoop环境算是搭建完毕。下面就是等测试。
看似简单的不能再简单的搭建过程,这是你弄明白之后的事情。在从hadoop1到2之间的过度,主要的变化是namenode和mapreduce到yarn架构之间的变化。就在这简单的配置过程中,加上可参考网上众多配置教程,也耽误了太长时间。不是文件难配置,而是在出现问题,不知道怎么解决,就一直卡在那儿。咨询过一些大牛,但是他们也是搪塞,没有给出真正问题的原因。其中有一个问题,在QQ群中,咨询过一个人,从他那边才得到启发,把其中的一个问题给解决掉。这也是我们遇到的问题,没有一个平台,导致在一些别人看似不是问题的问题上耽误太长时间。

二)安装过程二

测试启动
按照下面的每一步执行,执行完一定要看输出的信息,注意warn或error或fatal的情况。因为这都是可能是问题出现的地方。出现一个问题,不解决,可能就会影响接下来的测试。这才是真正的工作量。
1、启动zookeeper
在hadoop1、hadoop2、hadoop3、hadoop4、hadoop5上zookeeper目录下分别执行命令:

  1. bin/zkServer.sh start

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

  1. 23598 Jps
  2. 22491 QuorumPeerMain

当所有机器执行上述命令完毕后,再在每台机器上执行:

  1. bin/zkServer.sh status

查看每台机器zookeeper的状态,正确的话,只有一台机器是leader,其余机器都是显示folower。1-5台机器都需要测试一下,效果如下:

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="font-size:14px;">      <span style="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 终端上会输出一连串的信息。最后结束的信息是

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="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

   正常命令输出结尾:

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="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>  

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

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

终端输出:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="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的时候,装过两次,但是对应的data和log目录数据没有更改,导致在执行formatZK命令的时候报错。

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

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

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

   验证:

   执行:zkCli.sh

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

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

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、hadoop2、hadoop3、hadoop4、hadoop5上分别hadoop目录

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

  命令输出(以hadoop1为例):

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="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为例):

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="font-size:12px;">[tom@hadoop1 hadoop]$ jps    
    23396 JournalNode    
    23598 Jps    
    22491 QuorumPeerMain    
    [tom@hadoop1 hadoop]$</span>  

  查看一下目录结构:

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="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后,会在本地磁盘产生一个目录,用户保存NameNode的edits文件的数据】

4、格式化集群的一个NameNode

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

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

 bin/hdfs namenode -format -clusterId c1

  命令输出:

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="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>  

  验证查看一下目录结构:

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

[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会在磁盘产生一个目录,用于保存NameNode的fsimage、edits等文件】   

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

5、启动刚才格式化的namenode

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

  命令输出:

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

[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中

  在hadoop2上home/tom/yarn/hadoop-2.2.0/目录上

  执行命令:

  bin/hdfs namenode –bootstrapStandby

  命令输出:

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

[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

   命令输出:

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

[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进程没有启动。这个问题,也是卡在那儿不得已解决,耽误很长时间。问题,就出现在6、7两个步骤上。不知道怎么解决,后来咨询一个哥们,那哥们把在

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上查看代码片派生到我的代码片

<span style="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为例):

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="font-size:12px;">  
[tom@hadoop2 ~yarn/hadoop-2.2.0]$ jps      
    23396 JournalNode      
    24302 Jps      
    23558 NameNode      
    22491 QuorumPeerMain      
    [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上查看代码片派生到我的代码片

[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        
    23558 NameNode      
    22491 QuorumPeerMain      
    25281 Jps      
    [tom@hadoop1 ~yarn/hadoop-2.2.0]$  

  【产生java进程ResourceManager和NodeManager】

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

10、启动ZooKeeperFailoverCotroller

   在hadoop1、hadoop2、hadoop3、hadoop4、hadoop5、hadoop6上分别执行命令: sbin/hadoop-daemon.sh start zkfc

   命令输出(以hadoop1为例):

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

[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的状态是standby,hadoop2的状态是active。原先两个namenode都是standby的状态。

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

   23558 NameNode  

然后jps:nemenode进程不存在了

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

<span style="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个小时。还有很多问题都没有写完,后续会继续跟近,也欢迎与读者讨论交谈。

    读者有益,写着有劳。关爱身边每一个人,热爱身体,珍惜生命,且行且珍惜。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注