天天看點

搭建 hadoop2 自動切換HA 叢集

hadoop2 比 hadoop1的一些新的功能:

其中HA解決了hadoop1的單點故障問題

1) 各節點:

namenode:master   slave3

datanode:slave1  slave2  slave3

journalnode: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.     a.1)把conf/zoo_sample.cfg重命名為conf/zoo.cfg  mv zoo_sample.cfg zoo.cfg  
  3.     a.2)修改檔案conf/zoo.cfg  
  4.      1)dataDir=/usr/local/zookeeper/data  
  5.      2)增加以下内容  
  6.      server.1=master:2888:3888   
  7. ---> 辨別1 是master對應在zookeeper叢集的編号 2888:3888是資料通信端口  
  8.      server.2=slave1:2888:3888  
  9. ---> 辨別2 是slave1對應在zookeeper叢集的編号 2888:3888是資料通信端口  
  10.      server.3=slave3:2888:3888
  11. ---> 辨別3 是slave3對應在zookeeper叢集的編号 2888:3888是資料通信端口  
  12.     a.3) mkdir zookeeper/data   
  13.     [root@master zookeeper]# mkdir data  
  14.     a.4) 寫入檔案echo 1到 zookeeper/data/myid 這樣在本機master内寫上辨別1 兩者關聯起來  
  15.     [root@master zookeeper]# echo 1 > data/myid  
  16. b) 複制zookeeper檔案夾到slave1、slave3上  
  17.     scp -rq zookeeper  slave1:/usr/local  
  18.     scp -rq zookeeper  slave3:/usr/local  
  19. c) 其餘節點寫辨別  
  20.     在slave1上執行指令echo 2 zookeeper/data/myid  
  21.     在slave3上執行指令echo 3 zookeeper/data/myid  
  22. d) 啟動和驗證  
  23.     在master  slave1  slave3上,分别執行指令zookeeper/bin/zkServer.sh start  
  24.     執行指令zookeeper/bin/zkServer.sh status 可以看到三個節點的狀态 哪個是leader 哪個是follower   
  25.     直接開啟

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

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

5) 删除其他節點的hadoop檔案夾,修改好後拷貝到其餘節點

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

6) 啟動hadoop2 hdfs叢集

  1. 6.1) 格式化zk叢集  
  2.   在master上執行hadoop2.5/bin/hdfs zkfc -formatZK   此操作僅僅表示和zk叢集發生關聯  
  3.   15/01/11 18:14:20 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/cluster1 in ZK.  
  4. 3在zookeeper中初始化 
  5. $HADOOP_HOME/bin/hdfs zkfc -formatZK
  6. 運作這個指令後,會在zookeeper上建立一個/hadoop-ha/mycluster/的znode,用來存放automatic  failover的資料
  7. 4 啟動zkfc(zookeeper failover controller) 
  8. 需要在namenode1和namenode2上都啟動zkfc daemon程序。
  9. $HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
  10. 6.2) 啟動journalnode叢集  
  11.   在master、slave1、slave3上分别執行hadoop/sbin/hadoop-daemon.sh start journalnode  
  12. 6.3) 格式化namenode、啟動namenode 
  13. 在[nn1]上,對其進行格式化,并啟動: 
  14.   在h2master上執行bin/hdfs namenode -format  
  15.   在h2master上執行sbin/hadoop-daemon.sh start namenode 
  16. 在[nn2]上,同步nn1的中繼資料資訊: 
  17.   在h2master2上執行bin/hdfs namenode -bootstrapStandby  
  18.   在h2master2上執行sbin/hadoop-daemon.sh start namenode  
  19. 6.4)  啟動datanode  
  20.   在h2master上執行hadoop/sbin/hadoop-daemons.sh start datanode   啟動所有datanode節點  
  21.   此時通路如下連結  
  22.   http://master:50070/ http://slave3:50070/  
  23.   兩個namenode都是standby狀态  
  24. 6.5)  啟動ZKFC (FailoverController) 必須是在namenode節點上啟動 讓zk來決定用哪個namenode作為active  
  25.   在master、slave3上 啟動zkfc,執行指令sbin/hadoop-daemon.sh start zkfc  
  26.   此時通路   http://master:50070/ http://slave3:50070/ 結果如下:  
  27.   Overview 'master:9000' (active)  
  28.   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