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)
二. 首次啟動/格式化叢集
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 datanode 2) 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 historyserver yarn-daemon.sh stop resourcemanager yarn-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 datanode 2) 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>