Hadoop2.2.0+HA+zookeeper3.4.5詳細配置過程+體系結構+錯誤處理(2)
這篇文章,主要是針對zookeeper和hadoop集羣的整體測試,以及自己在實際過程遇到的問題和解決思路。
如有轉載,請注意明出處!
http://blog.csdn.net/yczws1/article/details/23594149
測試啓動
按照下面的每一步執行,執行完一定要看輸出的信息,注意warn或error或fatal的情況。因爲這都是可能是問題出現的地方。出現一個問題,不解決,可能就會影響接下來的測試。這纔是真正的工作量。
1、啓動zookeeper
在hadoop1、hadoop2、hadoop3、hadoop4、hadoop5上zookeeper目錄下分別執行命令:bin/zkServer.sh start
在每一臺機器執行完上面的命令後,執行jps,會顯示:這是初步認定啓動沒有問題
- <span style="font-size:14px;"> <span style="font-size:12px;">23598 Jps
- 22491 QuorumPeerMain </span></span>
當所有機器執行上述命令完畢後,再在每臺機器上執行:bin/zkServer.sh status 查看每臺機器zookeeper的狀態,正確的話,只有一臺機器是leader,其餘機器都是顯示folower。1-5臺機器都需要測試一下,效果如下:
- <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 終端上會輸出一連串的信息。最後結束的信息是
- <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
正常命令輸出結尾:
- <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>
如果終端輸出是以上面結尾,應該是沒有出現問題。
而我在執行的時候,遇到一個問題:在出現上面類似代碼之後,報了一個異常,導致後面的執行沒有結果,問題就出在這個異常的之上。
終端輸出:
- <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成功,否則就出現問題:
- 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爲例):
- <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爲例):
- <span style="font-size:12px;">[tom@hadoop1 hadoop]$ jps
- 23396 JournalNode
- 23598 Jps
- 22491 QuorumPeerMain
- [tom@hadoop1 hadoop]$</span>
查看一下目錄結構:
- <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
命令輸出:
- <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>
驗證查看一下目錄結構:
- [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
命令輸出:
- [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
命令輸出:
- [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
命令輸出:
- [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
命令輸出:
- <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爲例):
- <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
命令輸出:
- [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爲例):
- [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進程不存在了
- <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個小時。還有很多問題都沒有寫完,後續會繼續跟近,也歡迎與讀者討論交談。
讀者有益,寫着有勞。關愛身邊每一個人,熱愛身體,珍惜生命,且行且珍惜。