Hadoop高可用(HA)集群是企業級大數據平臺的核心基礎設施,通過多主節點冗余和自動故障轉移機制,確保系統在單點故障時仍能正常運行。本文將詳細介紹如何基于CentOS 7搭建Hadoop 3.X高可用集群,涵蓋環境準備、組件配置、集群啟動及管理的全流程。
一、環境要求與準備
1. 基礎環境配置
# 系統要求
CentOS 7.x
JDK 8+
Zookeeper 3.7+
Hadoop 3.X
2. 環境變量配置
# 編輯~/.bash_profile
export JAVA_HOME=/home/hadoop/app/jdk
export ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
export HADOOP_HOME=/home/hadoop/app/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin# 使配置生效
source ~/.bash_profile
3. 集群節點規劃
主機名 | NameNode | ResourceManager | ZKFC | DataNode | NodeManager | JournalNode | Zookeeper |
---|---|---|---|---|---|---|---|
hadoop01 | ? | ? | ? | ? | ? | ? | |
hadoop02 | ? | ? | ? | ? | ? | ? | ? |
hadoop03 | ? | ? | ? | ? | |||
hadoop04 | ? |
二、網絡與SSH配置
1. 關閉防火墻
# 所有節點執行
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
2. 配置域名解析
# 編輯所有節點的/etc/hosts
vi /etc/hosts# 添加以下內容
192.168.1.101 hadoop01
192.168.1.102 hadoop02
192.168.1.103 hadoop03
192.168.1.104 hadoop04
3. SSH免密登錄配置
# 所有節點生成密鑰對
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa# 所有節點互傳公鑰
ssh-copy-id hadoop@hadoop01
ssh-copy-id hadoop@hadoop02
ssh-copy-id hadoop@hadoop03
ssh-copy-id hadoop@hadoop04# 驗證免密登錄
ssh hadoop01
三、Zookeeper集群安裝
1. 解壓與配置
# 解壓安裝包(hadoop01執行)
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C ~/app/
cd ~/app/
mv apache-zookeeper-3.7.1-bin zookeeper# 配置文件
cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
vi $ZOOKEEPER_HOME/conf/zoo.cfg# 修改內容
dataDir=/home/hadoop/data/zk
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
2. 復制配置到其他節點
# 從hadoop01復制到其他節點
scp -r ~/app/zookeeper hadoop@hadoop02:~/app/
scp -r ~/app/zookeeper hadoop@hadoop03:~/app/
3. 創建myid文件
# hadoop01執行
mkdir -p /home/hadoop/data/zk
echo 1 > /home/hadoop/data/zk/myid# hadoop02執行
mkdir -p /home/hadoop/data/zk
echo 2 > /home/hadoop/data/zk/myid# hadoop03執行
mkdir -p /home/hadoop/data/zk
echo 3 > /home/hadoop/data/zk/myid
4. 啟動Zookeeper集群
# 所有ZK節點啟動服務
zkServer.sh start# 檢查狀態(每個節點應顯示leader或follower)
zkServer.sh status
四、Hadoop配置文件詳解
1. hadoop-env.sh
# 配置Java路徑
export JAVA_HOME=/home/hadoop/app/jdk
2. core-site.xml
<configuration><property><name>fs.defaultFS</name><value>hdfs://mycluster</value></property><property><name>hadoop.tmp.dir</name><value>/home/hadoop/data/hdfs</value></property><property><name>ha.zookeeper.quorum</name><value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value></property>
</configuration>
3. hdfs-site.xml
<configuration><property><name>dfs.replication</name><value>3</value></property><property><name>dfs.nameservices</name><value>mycluster</value></property><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop01:8020</value></property><!-- 其他NameNode配置... --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property>
</configuration>
4. yarn-site.xml
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><!-- 其他RM配置... -->
</configuration>
5. mapred-site.xml
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property><property><name>mapreduce.application.classpath</name><value>$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*</value></property>
</configuration>
6. workers文件
# 配置DataNode節點
hadoop01
hadoop02
hadoop03
五、Hadoop集群啟動流程
1. 啟動JournalNode
# 在hadoop02、hadoop03、hadoop04上執行
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode# 驗證啟動
jps | grep JournalNode
2. 格式化HDFS
# 在hadoop01上執行
$HADOOP_HOME/bin/hdfs namenode -format# 啟動第一個NameNode
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
3. 同步第二個NameNode
# 在hadoop02上執行
$HADOOP_HOME/bin/hdfs namenode -bootstrapStandby
4. 格式化ZKFC
# 在hadoop01上執行
$HADOOP_HOME/bin/hdfs zkfc -formatZK
5. 啟動集群
# 停止所有服務(確保干凈啟動)
$HADOOP_HOME/sbin/stop-all.sh# 啟動HDFS和YARN
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh# 啟動ZKFC
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
六、Web UI訪問
服務 | URL | 說明 |
---|---|---|
YARN ResourceManager | http://hadoop01:8088/ui2 | 資源管理與作業監控 |
HDFS NameNode | http://hadoop01:9870 | HDFS文件系統查看 |
MapReduce HistoryServer | http://hadoop01:19888 | 歷史作業詳情 |
七、高可用集群管理
1. ResourceManager管理
# 查看RM狀態
yarn rmadmin -getServiceState rm1# 手動切換為Active狀態
yarn rmadmin -transitionToActive rm2# 刷新隊列配置
yarn rmadmin -refreshQueues
2. NameNode管理
# 查看NN狀態
hdfs haadmin -getServiceState nn1# 手動故障轉移
hdfs haadmin -failover --forceactive nn1 nn2# 檢查健康狀態
hdfs haadmin -checkHealth nn2
八、常見問題排查
1. 服務無法啟動
- 檢查日志:
$HADOOP_HOME/logs/
- 確認配置文件一致性
- 檢查端口占用:
netstat -tulpn | grep <端口號>
2. 自動故障轉移失敗
- 驗證Zookeeper集群狀態
- 檢查SSH免密配置
- 確認dfs.ha.fencing.methods配置正確
3. 數據不同步
- 檢查JournalNode服務狀態
- 查看NameNode日志中的編輯日志同步情況
- 手動執行bootstrapStandby操作
九、性能優化建議
-
內存配置優化
# 修改yarn-site.xml <property><name>yarn.nodemanager.resource.memory-mb</name><value>65536</value> </property> <property><name>yarn.scheduler.maximum-allocation-mb</name><value>32768</value> </property>
-
HDFS塊大小調整
# hdfs-site.xml <property><name>dfs.blocksize</name><value>268435456</value> <!-- 256MB --> </property>
-
數據本地化優化
# yarn-site.xml <property><name>yarn.nodemanager.local-dirs</name><value>/data1/hadoop/nm-local-dir,/data2/hadoop/nm-local-dir</value> </property>
通過以上步驟,你可以成功搭建一個高可用的Hadoop集群,實現HDFS和YARN的雙高可用架構。在生產環境中,建議定期備份關鍵數據,監控集群性能,并進行必要的容量規劃,以確保系統穩定運行。