hadoop2 比 hadoop1的一些新的功能:

其中HA解决了hadoop1的单点故障问题

1) 各节点:

namenode:master   slave3
datanode:slave1  slave2  slave3journalnode:master  slave1  slave3
zookeeper: master  slave1  slave3

2)hadoop2 搭建在手工切换ha的集群基础上:

a) 关闭所有启动角色
b) 删除所有机器/usr/local/hadoop/tmp 和 /usr/local/hadoop/logs的内容

3) zookeeper集群安装:

1. a) master上安装zookeeper  
2. 1)把conf/zoo_sample.cfg重命名为conf/zoo.cfg  mv zoo_sample.cfg zoo.cfg  
3. 2)修改文件conf/zoo.cfg  
4. 1)dataDir=/usr/local/zookeeper/data  
5. 2)增加以下内容  
6. 1=master:2888:3888
7. ---> 标识1 是master对应在zookeeper集群的编号 2888:3888是数据通信端口  
8. 2=slave1:2888:3888
9. ---> 标识2 是slave1对应在zookeeper集群的编号 2888:3888是数据通信端口  
10. 3=slave3:2888:3888
11. ---> 标识3 是slave3对应在zookeeper集群的编号 2888:3888是数据通信端口  
12. 3) mkdir zookeeper/data   
13. @master
14. 4) 写入文件echo 1到 zookeeper/data/myid 这样在本机master内写上标识1
15. @master zookeeper]# echo 1
16.   
17.       
18. b) 复制zookeeper文件夹到slave1、slave3上  
19.   
20. slave1:/usr/local  
21. slave3:/usr/local  
22.       
23.       
24. c) 其余节点写标识  
25. slave1上执行命令echo 2
26. slave3上执行命令echo 3
27.   
28.   
29. d) 启动和验证  
30. master  slave1  slave3上,分别执行命令zookeeper/bin/zkServer.sh start  
31.     执行命令zookeeper/bin/zkServer.sh status 可以看到三个节点的状态 哪个是leader 哪个是follower   
32.     直接开启

4) hdfs配置文件:(hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves)

1. 2.1
2. 2.1.1
3.   export JAVA_HOME=/usr/local/jdk  
4. 2.1.2
5.   
6. <property>  
7. <name>fs.default.name</name>  
8. <value>hdfs://cluster1</value>
9. </property>  
10.   
11. <property>  
12. <name>hadoop.tmp.dir</name>  
13. <value>/usr/local/hadoop/tmp</value>  
14. </property>  
15.   
16. <property>  
17. <name>ha.zookeeper.quorum</name>    ------ 配置zk集群  
18. <value>master:2181,slave1:2181,  slave3:2181</value>  
19. </property>  
20.   
21.   
22. 2.1.3
23. <property>  
24. <name>dfs.replication</name>  
25. <value>3</value>  
26. </property>  
27.   
28. <property>  
29. <name>dfs.nameservices</name> ----每个nameservice对应一个hdfs集群  
30. <value>cluster1</value>  
31. </property>  
32.   
33. <property>  
34. <name>dfs.ha.namenodes.cluster1</name>  
35. <value>master,slave3</value>  
36. </property>  
37.   
38. <property>  
39. <name>dfs.namenode.rpc-address.cluster1.master</name>  
40. <value>master:9000</value>  
41. </property>  
42.   
43. <property>  
44. <name>dfs.namenode.http-address.cluster1.master</name>  
45. <value>master:50070</value>  
46. </property>  
47.   
48. <property>  
49. <name>dfs.namenode.rpc-address.cluster1.slave3</name>  
50. <value>slave3:9000</value>  
51. </property>  
52.   
53. <property>  
54. <name>dfs.namenode.http-address.cluster1.slave3</name>  
55. <value>slave3:50070</value>  
56. </property>  
57.   
58. <property>  
59. <name>dfs.ha.automatic-failover.enabled.cluster1</name>  
60. <value>true</value>  
61. </property>  
62.   
63. <property>  
64. <name>dfs.namenode.shared.edits.dir</name>  
65. <value>qjournal://master:8485;slave1:8485;slave3:8485/cluster1</value>
66. </property>  
67.   
68. <property>  
69. <name>dfs.journalnode.edits.dir</name>  
70. <value>/usr/local/hadoop/tmp/journal</value>  
71. </property>  
72.   
73. <property>  
74. <name>dfs.ha.fencing.methods</name>  
75. <value>
76.    sshfence
77.    shell(/bin/true)
78. </value>  
79. </property>  
80.   
81. <property>  
82. <name>dfs.ha.fencing.ssh.private-key-files</name>  
83. <value>/root/.ssh/id_rsa</value>  
84. </property>  
85.   
86. <property>  
87. <name>dfs.client.failover.proxy.provider.cluster1</name>  
88. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
89. </property>  
90.   
91. 2.1.6
92. slave1
93. slave2
94. slave3

5) 删除其他节点的hadoop文件夹,修改好后拷贝到其余节点

scp -r /usr/local/hadoop   其他:/usr/local/

6) 启动hadoop2 hdfs集群

1. 6.1) 格式化zk集群  
2. 5/bin/hdfs zkfc -formatZK   此操作仅仅表示和zk集群发生关联  
3. 15/01/11 18:14:20
4. 
5. 3在zookeeper中初始化 
6. $HADOOP_HOME/bin/hdfs zkfc -formatZK
7. 运行这个命令后,会在zookeeper上创建一个/hadoop-ha/mycluster/的znode,用来存放automatic  failover的数据
8. 4 启动zkfc(zookeeper failover controller) 
9. 需要在namenode1和namenode2上都启动zkfc daemon进程。
10. $HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
11. 
12. 6.2) 启动journalnode集群  
13. slave1、slave3上分别执行hadoop/sbin/hadoop-daemon.sh start journalnode  
14. 6.3) 格式化namenode、启动namenode 
15. 在[nn1]上,对其进行格式化,并启动:
16.   在h2master上执行bin/hdfs namenode -format  
17.   在h2master上执行sbin/hadoop-daemon.sh start namenode 
18. 在[nn2]上,同步nn1的元数据信息:
19.   在h2master2上执行bin/hdfs namenode -bootstrapStandby  
20.   在h2master2上执行sbin/hadoop-daemon.sh start namenode  
21. 6.4)  启动datanode  
22.   在h2master上执行hadoop/sbin/hadoop-daemons.sh start datanode   启动所有datanode节点  
23.   此时访问如下链接  
24. //master:50070/ http://slave3:50070/
25.   两个namenode都是standby状态  
26. 6.5)  启动ZKFC (FailoverController) 必须是在namenode节点上启动 让zk来决定用哪个namenode作为active  
27. slave3上 启动zkfc,执行命令sbin/hadoop-daemon.sh start zkfc  
28. //master:50070/ http://slave3:50070/ 结果如下:
29. 'master:9000'
30.   Overview 'slave3:9000' (standby)

7) 验证自动切换:

  关闭master的namenode进程: 
  再次刷新

http://h2master:50070/ http://slave3:50070/ 结果如下:
   Overview 'slave3:9000' (active)  ----> zk自动切换节点slave3为active状态
   master无法连接

8) 总结:自动切换比手工切换多出来的步骤

  (1)配置上core-site.xml增加了配置项ha.zookeeper.quorum(zk集群的配置);
     hdfs-site.xml中把dfs.ha.automatic-failover.enabled.cluster1改为true

  (3)操作上格式化zk,执行命令bin/hdfs zkfc -formatZK;
     启动zkfc,执行命令sbin/hadoop-daemon.sh start zkfc


转载于:https://blog.51cto.com/01wang/1656899