在 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. 日常重啓順序

日常維護時,如果已經初始化過,只需要:

  1. ZooKeeper → 2. JournalNode → 3. NameNode → 4. DataNode → 5. ZKFC

3. 驗證要點

# 確保所有服務都正常啓動
jps

# 預期應該看到(在不同節點):
# NameNode 節點: NameNode, JournalNode, ZKFC
# DataNode 節點: DataNode, JournalNode
# ZK 節點: QuorumPeerMain

按照這個順序啓動,您的 Hadoop HA 集羣應該能夠正常啓動並實現高可用功能。