在 ZooKeeper 搭建 Hadoop HA 集羣時,啓動順序非常重要,錯誤的順序會導致服務無法正常啓動或無法實現高可用。
Hadoop HA 集羣的正確啓動順序
第1步:啓動 ZooKeeper 集羣
在所有 ZooKeeper 節點上啓動:
# 在每台 ZK 節點上執行
zkServer.sh start
# 檢查狀態
zkServer.sh status
驗證:
# 任意節點執行,檢查 ZK 集羣狀態
echo stat | nc hadoop101 2181
第2步:啓動 JournalNode 集羣
在所有 JournalNode 節點上啓動:
# 在 hadoop101、hadoop102、hadoop103 上分別執行
hdfs --daemon start journalnode
# 檢查 JournalNode 進程
jps | grep JournalNode
第3步:格式化並啓動第一個 NameNode
在 hadoop101 上執行:
# 1. 格式化 NameNode(僅在首次部署時執行)
hdfs namenode -format
# 2. 啓動第一個 NameNode
hdfs --daemon start namenode
第4步:在備用 NameNode 上同步元數據
在 hadoop102 上執行:
# 同步元數據從 active NameNode
hdfs namenode -bootstrapStandby
# 啓動備用 NameNode
hdfs --daemon start namenode
第5步:啓動所有 DataNode
在所有 DataNode 節點上啓動:
# 使用腳本啓動所有 DataNode
start-dfs.sh
# 或者手動在每個節點啓動
hdfs --daemon start datanode
第6步:初始化 ZKFC 並啓動故障轉移控制器
在任意 NameNode 節點上執行:
# 在 ZK 中初始化 HA 狀態(僅在首次部署時執行)
hdfs zkfc -formatZK
# 在兩個 NameNode 上啓動 ZKFC
hdfs --daemon start zkfc
完整的啓動腳本示例
自動化啓動腳本
#!/bin/bash
echo "=== 啓動 Hadoop HA 集羣 ==="
echo "1. 啓動 ZooKeeper 集羣..."
for host in hadoop101 hadoop102 hadoop103; do
ssh $host "zkServer.sh start"
done
echo "2. 啓動 JournalNode..."
for host in hadoop101 hadoop102 hadoop103; do
ssh $host "hdfs --daemon start journalnode"
done
echo "3. 啓動 NameNode..."
ssh hadoop101 "hdfs --daemon start namenode"
ssh hadoop102 "hdfs --daemon start namenode"
echo "4. 啓動 DataNode..."
start-dfs.sh
echo "5. 啓動 ZKFC..."
ssh hadoop101 "hdfs --daemon start zkfc"
ssh hadoop102 "hdfs --daemon start zkfc"
echo "=== 啓動完成 ==="
驗證集羣狀態
# 檢查 NameNode HA 狀態
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
# 檢查集羣狀態
hdfs dfsadmin -report
# 檢查 ZKFC 狀態
hdfs haadmin -checkHealth nn1
hdfs haadmin -checkHealth nn2
停止順序(與啓動順序相反)
#!/bin/bash
echo "=== 停止 Hadoop HA 集羣 ==="
echo "1. 停止 DataNode..."
stop-dfs.sh
echo "2. 停止 ZKFC..."
ssh hadoop101 "hdfs --daemon stop zkfc"
ssh hadoop102 "hdfs --daemon stop zkfc"
echo "3. 停止 NameNode..."
ssh hadoop101 "hdfs --daemon stop namenode"
ssh hadoop102 "hdfs --daemon stop namenode"
echo "4. 停止 JournalNode..."
for host in hadoop101 hadoop102 hadoop103; do
ssh $host "hdfs --daemon stop journalnode"
done
echo "5. 停止 ZooKeeper..."
for host in hadoop101 hadoop102 hadoop103; do
ssh $host "zkServer.sh stop"
done
echo "=== 停止完成 ==="
關鍵注意事項
1. 首次部署的特殊步驟
hdfs namenode -format(只在第一次執行)hdfs namenode -bootstrapStandby(只在第一次執行)hdfs zkfc -formatZK(只在第一次執行)
2. 日常重啓順序
日常維護時,如果已經初始化過,只需要:
- ZooKeeper → 2. JournalNode → 3. NameNode → 4. DataNode → 5. ZKFC
3. 驗證要點
# 確保所有服務都正常啓動
jps
# 預期應該看到(在不同節點):
# NameNode 節點: NameNode, JournalNode, ZKFC
# DataNode 節點: DataNode, JournalNode
# ZK 節點: QuorumPeerMain
按照這個順序啓動,您的 Hadoop HA 集羣應該能夠正常啓動並實現高可用功能。
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。