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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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個小時。還有很多問題都沒有寫完,後續會繼續跟近,也歡迎與讀者討論交談。

        讀者有益,寫着有勞。關愛身邊每一個人,熱愛身體,珍惜生命,且行且珍惜。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章