1. 程式人生 > >HA 模式下的 Hadoop+ZooKeeper+HBase 啟動順序

HA 模式下的 Hadoop+ZooKeeper+HBase 啟動順序

一. 背景

1.1 網路上的大部分教程的順序

1. 啟動順序

  • Hadoop
  • ZooKeeper
  • HBase
  • 第二個HMaster

2. 停止順序

  • 第二個 HMaster,kill-9 刪除
  • Hbase
  • ZooKeeper
  • Hadoop

Note:網上的以上的順序並不適合 HA 模式下

1.2 主機規劃

IP 主機名 使用者名稱 部署模組 程序
10.6.3.43 master5 hadoop5 NameNodeResourceManagerHBase NameNodeDFSZKFailoverControllerResourceManagerHMasterJobHistoryServer
10.6.3.33 master52 hadoop5 NameNodeResourceManagerHBase NameNodeDFSZKFailoverControllerResourceManagerHMasterJobHistoryServer
10.6.3.48 slave51 hadoop5 DataNodeNodeManagerZookeeperHBase DataNodeNodeManagerHRegionServerJournalNodeQuorumPeerMain
10.6.3.32 slave52 hadoop5 DataNodeNodeManagerZookeeperHBase DataNodeNodeManagerHRegionServerJournalNodeQuorumPeerMain
10.6.3.36 slave53 hadoop5 DataNodeNodeManagerZookeeperHBase DataNodeNodeManagerHRegionServerJournalNodeQuorumPeerMain

1.3 正確的啟動順序

1. ZooKeeper -> Hadoop -> HBase

2. ZooKeeper -> JournalNode (Hadoop) -> NameNode (Hadoop)

-> DataNode (Hadoop) -> 主 ResourceManager/NodeManager (Hadoop) -> 備份 ResourceManager (Hadoop) -> ZKFC (Hadoop) -> MapReduce JobHistory (Hadoop) -> 主 Hmaster/HRegionServer (HBase) ->備份 Hmaster (HBase)

二. 首次啟動/格式化叢集

1. 啟動 ZooKeeper 叢集 在叢集中安裝 ZooKeeper 的主機上啟動 ZooKeeper 服務。在本教程中也就是在 slave51、slave52、slave53 的主機上啟動相應程序。分別登陸到三臺機子上執行:

zkServer.sh start
  • 1

2. 格式化 ZooKeeper 叢集 在任意的 namenode 上都可以執行,筆者還是選擇了 master5 主機執行格式化命令

hdfs zkfc –formatZK
  • 1

3. 啟動 JournalNode 叢集 分別在 slave51、slave52、slave53 上執行以下命令

hadoop-daemon.sh start journalnode
  • 1

4. 格式化叢集的 NameNode

在 master5 的主機上執行以下命令,以格式化 namenode:

hdfs namenode -format
  • 1

5. 啟動剛格式化的 NameNode 剛在 master5 上格式化了 namenode ,故就在 master5 上執行

adoop-daemon.sh start namenode
  • 1

6. 同步 NameNode1 元資料到 NameNode2 上 複製你 NameNode 上的元資料目錄到另一個 NameNode,也就是此處的 master5 複製元資料到 master52 上。在 master52 上執行以下命令:

hdfs namenode -bootstrapStandby
  • 1

7. 啟動 NameNode2 master52 主機拷貝了元資料之後,就接著啟動 namenode 程序了,執行

hadoop-daemon.sh start namenode
  • 1

8. 啟動叢集中所有的DataNode

在 master5 上執行

hadoop-daemons.sh start datanode
  • 1

9. 在 RM1 啟動 YARN

在 master5 的主機上執行以下命令:

start-yarn.sh
  • 1

10. 在 RM2 單獨啟動 YARN

雖然上一步啟動了 YARN ,但是在 master52 上是沒有相應的 ResourceManager 程序,故需要在 master52 主機上單獨啟動:

yarn-daemon.sh start resourcemanager
  • 1

11. 啟動 ZKFC

在 master5 和 master52 的主機上分別執行如下命令:

hadoop-daemon.sh start zkfc
  • 1

12. 開啟歷史日誌服務

在 master5 和 master52 的主機上執行

mr-jobhistory-daemon.sh   start historyserver
  • 1

13. 啟動主 HMaster

在其中一臺主機上啟動 Hmaster,即筆者在 master5 上

start-hbase.sh 
  • 1

14. 啟動備份 HMaster 另一臺 Hmaster 的主機上,即筆者在 master52 上,執行以下命令

hbase-daemon.sh start master
  • 1

三. 開啟與關閉叢集順序

3.1 Hadoop 生態系統叢集的啟動順序概覽

以下中標註紅色加粗的即為筆者叢集目前已經安裝的。

順序 服務 備註 有關說明和更多資訊
1 ZooKeeper 建議在啟動 HDFS 之前先啟動 ZooKeeper;這是高可用性 (HA) 部署中的要求。在任何情況下,始終在 HBase 之前先啟動 ZooKeeper 在單個伺服器上安裝 ZooKeeper Server 包並啟動 ZooKeeper;在生產環境中安裝 ZooKeeper;部署 HDFS High Availability;為 ResourceManager (YARN) 配置 高可用性
2 HDFS 除 ZooKeeper 以外,在所有其它服務之前先啟動 HDFS。如果您正在使用 HA,請參閱高可用性指南中的說明
3 HttpFS HttpFS 安裝
4a MRv1 在 Hive 或 Oozie 之前先啟動 MapReduce。如果 YARN 正在執行,請勿啟動 MRv1 在叢集中部署 MapReduce v1 (MRv1);為 JobTracker (MRv1) 配置 高可用性
4b YARN 在 Hive 或 Oozie 之前啟動 YARN。如果 MRv1 正在執行,請勿啟動 YARN
5 HBase 啟動 HBase Master;在分散式叢集中部署 HBase
6 Hive 在啟動 HiveServer2 和 Hive console 之前先啟動 Hive Metastore 安裝 Hive
7 Oozie 啟動 Oozie Server
8 Flume 1.x 執行 Flume
9 Sqoop Sqoop 安裝和 Sqoop 2 安裝
10 Hue Hue 安裝

3.2 非首次啟動叢集

順序 步驟 操作主機 命令 開啟的相應程序
1 啟動 ZooKeeper 叢集 slave51、slave52、slave53 zkServer.sh start QuorumPeerMain
2 啟動 JournalNode 叢集 slave51、slave52、slave53 hadoop-daemon.sh start journalnode JournalNode
3 啟動剛格式化的 NameNode master5 hadoop-daemon.sh start namenode NameNode
4 同步 NameNode1 元資料到 NameNode2 上 master52 hdfs namenode -bootstrapStandby
5 啟動 NameNode2 master52 hadoop-daemon.sh start namenode NameNode
6 啟動叢集中所有的DataNode 1) master5 2) slave51、slave52、slave53 (二者選一即可,下同) 1) hadoop-daemons.sh start datanode2) hadoop-daemon.sh start datanode DataNode
7 在 RM1 啟動 YARN master5 start-yarn.sh ResourceManager(master5) NodeManager(slave節點)
8 在 RM2 單獨啟動 YARN master52 yarn-daemon.sh start resourcemanager ResourceManager
9 啟動 ZKFC master5 與 master52 hadoop-daemon.sh start zkfc DFSZKFailoverController
10 開啟歷史日誌服務 master5 mr-jobhistory-daemon.sh start historyserver JobHistoryServer
11 啟動主 HMaster 和 HRegionServer master5 start-hbase.sh HMaster (master5上)HRegionServer (slave節點上)
12 啟動備份 HMaster master52 hbase-daemon.sh start master HMaster

Note:與 “首次啟動格式化叢集” 不同的是沒有 格式化 ZooKeeper 叢集格式化叢集的 NameNode 這兩個步驟!

3.3 Hadoop 生態系統叢集的關閉順序概覽

以下中標註紅色加粗的即為筆者叢集目前已經安裝的。

關閉順序 服務 備註 有關說明和更多資訊
1 Hue 在 Hue Server 機器上執行以下內容以停止 Hue: sudo service hue stop
2a Sqoop 1 在執行其的所有節點上執行以下內容: sudo service sqoop-metastore stop
2b Sqoop 2 在執行其的所有節點上執行以下內容: sudo /sbin/service sqoop2-server stop
3 Flume 0.9 在執行 Flume Node 程序的每個節點上將其停止:sudo service flume-node stop 停止 Flume Master: sudo service flume-master stop
4 Flume 1.x 沒有 Flume Master 在執行 Flume Node 程序的每個節點上將其停止:sudo service flume-ng-agent stop
5 Oozie sudo service oozie stop
6 Hive 要停止 Hive,請退出 Hive 控制檯,並確保沒有 Hive 指令碼執行,關閉 HiveServer2:sudo service hiveserver2 stop 關閉每個客戶端上的 Hive Metastore Daemon: sudo service hive-metastore stop 如果 Metastore 從命令列執行,使用 Ctrl-c 將其關閉
7 HBase 停止 Thrift Server 和客戶端,然後關閉叢集 要停止 Thrift Server 和客戶端:sudo service hbase-thrift stop 要關閉叢集,請在主節點上使用此命令:hbase-daemon.sh stop master 在託管 Region Server 的每個節點上使用以下命令: hbase-daemon.sh stop regionserver
8a MapReduce v1 停止 MapReduce 之前先停止 Hive 和 Oozie 要停止 MapReduce,請停止 JobTracker service,然後在執行 Task Tracker 的所有節點上將其停止。使用以下命令: sudo service hadoop-0.20-mapreduce-jobtracker stop sudo service hadoop-0.20-mapreduce-tasktracker stop
8b YARN 停止 YARN 之前先停止 Hive 和 Oozie 要停止 YARN,請在執行 MapReduce JobHistory 服務、ResourceManager 服務和 NodeManager 的所有節點上停止這些服務。使用以下命令: hadoop-daemon.sh stop historyserveryarn-daemon.sh stop resourcemanageryarn-daemon.sh stop nodemanager
9 HttpFS sudo service hadoop-httpfs stop
10 HDFS 要停止 HDFS:在 NameNode 上:hadoop-daemon.sh stop namenode 在 Secondary NameNode 上(如果使用):hadoop-daemon.sh stop secondnamenode 在每個 DataNode 上:hadoop-daemon.sh stop datanode
11 ZooKeeper 在停止 ZooKeeper 之前先停止 HBase 和 HDFS 要停止 ZooKeeper Server,請在每個 ZooKeeper 節點上使用以下命令: zkServer.sh stop

3.4 叢集關閉

順序 步驟 操作主機 命令 關閉的相應程序
1 關閉備份 HMaster master52 hbase-daemon.sh stop master HMaster
2 關閉主 HMaster 和 HRegionServer master5 stop-hbase.sh HMaster (master5上)HRegionServer (slave節點上)
3 關閉歷史日誌服務 master5 mr-jobhistory-daemon.sh stop historyserver JobHistoryServer
4 關閉 ZKFC master5 與 master52 hadoop-daemon.sh stop zkfc DFSZKFailoverController
5 在 RM2 單獨關閉 YARN master52 yarn-daemon.sh stop resourcemanager ResourceManager
6 在 RM1 關閉 YARN master5 stopt-yarn.sh ResourceManager (master5) NodeManager (slave節點)
7 關閉叢集中所有的DataNode 1) master5 2) slave51、slave52、slave53 (二者選一即可,下同) 1) hadoop-daemons.sh stop datanode2) hadoop-daemon.sh stop datanode DataNode
8 關閉 NameNode2 master52 hadoop-daemon.sh stop namenode NameNode
9 關閉剩下的 NameNode master5 hadoop-daemon.sh stop namenode NameNode
10 關閉 JournalNode 叢集 slave51、slave52、slave53 hadoop-daemon.sh stop journalnode JournalNode
11 關閉 ZooKeeper 叢集 slave51、slave52、slave53 zkServer.sh stop QuorumPeerMain

注意:一定要按順序停止,如果先停 ZooKeeper 再停 HBase 的話,基本停不下來

四. 常見問題與參考資料

4.1 常見問題

1. 我啟動 ZKFC 和 NameNode 守護程序的順序重要麼?

不重要,在任何給定的節點上,你可以任意順序啟動 ZKFC 和 NameNode 程序

2. 如果Zookeeper宕機會怎樣?

如果 Zookeeper 叢集宕機,沒有自動故障轉移將會被觸發。但是,HDFS 將繼續沒有任何影響的執行。當 Zookeeper 被重新啟動,HDFS 將重新連線,不會出現問題

3. 我可以指定兩個 NameNode 中的一個作為主要的 NameNode 麼?

當然不可以。目前,這是不支援的。先啟動的 NameNode 將會先變成 Active 狀態。你可以指定的順序,先啟動你希望成為 Active 的節點,來完成這個目的。所以筆者我在後面的叢集管理指令碼中,啟動完一臺 NameNode 後再啟動 ZKFC。和以上的順序有點出入,但一點問題都木有~

4.2 參考資料

				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>