hadoop學習(九)Hadoop2.2.0HAzookeeper3.4.5詳細配置過程錯誤處理(2) Hadoop2.2.0HAzookeeper3.4.5詳細配置過程體系結構錯誤處理(2) 這篇文章,主要是針對zookeeper和hadoop集群的整體測試,以及自己在實際過程遇到的問題和解決思路。 整個過程是,痛苦、無
hadoop學習(九)Hadoop2.2.0+HA+zookeeper3.4.5詳細配置過程+錯誤處理(2)
Hadoop2.2.0+HA+zookeeper3.4.5詳細配置過程+體系結構+錯誤處理(2)
這篇文章,主要是針對zookeeper和hadoop集群的整體測試,以及自己在實際過程遇到的問題和解決思路。
整個過程是,痛苦、無奈和糾結的。伴隨著N多夜晚。總結的過程就超過10個小時。還有很多問題都沒有寫完,后續會繼續跟近,也歡迎與讀者討論交談。
讀者有益,寫著有勞。關愛身邊每一個人,熱愛身體,珍惜生命,且行且珍惜。
http://blog.csdn.net/yczws1/article/details/23594149
按照下面的每一步執行,執行完一定要看輸出的信息,注意warn或error或fatal的情況。因為這都是可能是問題出現的地方。出現一個問題,不解決,可能就會影響接下來的測試。這才是真正的工作量。
在hadoop1、hadoop2、hadoop3、hadoop4、hadoop5上zookeeper目錄下分別執行命令:bin/zkServer.sh start
在每一臺機器執行完上面的命令后,執行jps,會顯示:這是初步認定啟動沒有問題
23598 Jps 22491 QuorumPeerMain
當所有機器執行上述命令完畢后,再在每臺機器上執行:bin/zkServer.sh status 查看每臺機器zookeeper的狀態,正確的話,只有一臺機器是leader,其余機器都是顯示folower。1-5臺機器都需要測試一下,效果如下:
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$
在hadoop1機器上,hadoop目錄,執行zkCli.sh 終端上會輸出一連串的信息。最后結束的信息是
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]
【可以看到ZK集群 中只有一個節點zookeeper】
格式化zookeeper集群,目的是在ZooKeeper集群上建立HA的相應節點。
在hadoop1上的hadoop的目錄執行:bin/hdfs zkfc –formatZK
正常命令輸出結尾:
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
如果終端輸出是以上面結尾,應該是沒有出現問題。
而我在執行的時候,遇到一個問題:在出現上面類似代碼之后,報了一個異常,導致后面的執行沒有結果,問題就出在這個異常的之上。
終端輸出:
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)
就是上面的異常,沒有解決,導致下面的問題都不能進行,因為下面要在執行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成功,否則就出現問題:
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]
在hadoop1、hadoop2、hadoop3、hadoop4、hadoop5上分別hadoop目錄
執行命令:sbin/hadoop-daemon.sh start journalnode
命令輸出(以hadoop1為例):
[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/]$
在每個節點執行完啟動命令后,每個節點都執行以下驗證。
驗證(以hadoop1為例):
[tom@hadoop1 hadoop]$ jps 23396 JournalNode 23598 Jps 22491 QuorumPeerMain [tom@hadoop1 hadoop]$
查看一下目錄結構:
[tom@hadoop1 ~yarn/yarn_data/]$ pwd /home/tom/yarn/yarn_data [tom@hadoop1 ~yarn/yarn_data/]$ ls tmp/ journal [tom@hadoop1 ~yarn/yarn_data/]$
【啟動JournalNode后,會在本地磁盤產生一個目錄,用戶保存NameNode的edits文件的數據】
從hadoop1和hadoop2中任選一個即可,這里選擇的是hadoop1
在hadoop1上/home/tom/yarn/hadoop-2.2.0/目錄下執行下面命令:
bin/hdfs namenode -format -clusterId c1
命令輸出:
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/]$
驗證查看一下目錄結構:
[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成功。
在hadoop1上/home/tom/yarn/hadoop-2.2.0/目錄下執行命令:/sbin/hadoop-daemon.sh start namenode
命令輸出:
[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。
在hadoop2上home/tom/yarn/hadoop-2.2.0/目錄上
執行命令:
bin/hdfs namenode –bootstrapStandby
命令輸出:
[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目錄,也同樣執行下面的過程,不過兩者產生的結果不一樣。
在hadoop2上/home/tom/yarn/hadoop-2.2.0/目錄下執行命令:/sbin/hadoop-daemon.sh start namenode
命令輸出:
[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起來的進程了。至此這個問題解決了。
Datanode是在slaves文件中配置的。在hadoop1上執行:
sbin/hadoop-daemons.sh start datanode
命令輸出:
[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]$
【上述命令會在四個節點分別啟動DataNode進程】
驗證(以hadoop1為例):
[tom@hadoop2 ~yarn/hadoop-2.2.0]$ jps 23396 JournalNode 24302 Jps 24232 DataNode 23558 NameNode 22491 QuorumPeerMain [tom@hadoop2 ~yarn/hadoop-2.2.0]$
【可以看到java進程DataNode】
在hadoop1上執行命令:sbin/start-yarn.sh
命令輸出:
[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 24232 DataNode 23558 NameNode 22491 QuorumPeerMain 25281 Jps [tom@hadoop1 ~yarn/hadoop-2.2.0]$
【產生java進程ResourceManager和NodeManager】
也可以通過瀏覽器訪問hadoop1:8088/cluster
在hadoop1、hadoop2、hadoop3、hadoop4、hadoop5、hadoop6上分別執行命令: sbin/hadoop-daemon.sh start zkfc
命令輸出(以hadoop1為例):
[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】
在執行完第10步的時候,在頁面可以觀察到兩個NameNode的狀態,hadoop1的狀態是standby,hadoop102的狀態是active。原先兩個namenode都是standby的狀態。
在hadoop1上我們執行:kill -9 23558
23558 NameNode
然后jps:nemenode進程不存在了
[tom@hadoop1 ~yarn/hadoop-2.2.0]$ jps 24599 DFSZKFailoverController 23396 JournalNode 24232 DataNode 22491 QuorumPeerMain 24654 Jps
然后刷新兩個頁面,可以看到,兩臺機器的狀態置換了。原先的active變成standby,原先的standby變成active,這說明,HA故障自動轉換是正常的,HDFS是高可用的。
等你順利結束上面所有的步驟,都很順利的話,說明,你集群搭建基本完成任務。說是基本,因為還有事情要做,就是,你要開始上傳文件開始測試程序,看看hadoop是否應用正常。這就是接下來要做的事情了。
整個過程是,痛苦、無奈和糾結的。伴隨著N多夜晚。總結的過程就超過10個小時。還有很多問題都沒有寫完,后續會繼續跟近,也歡迎與讀者討論交談。
讀者有益,寫著有勞。關愛身邊每一個人,熱愛身體,珍惜生命,且行且珍惜。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com