Hadoop在Linux中實現高可用性的核心步驟
在開始配置前,需完成以下基礎準備:
chrony),確保所有節點時間一致(時間偏差過大會導致ZooKeeper協調失敗或數據不一致)。NameNode是HDFS的核心元數據管理組件,其高可用性通過Active/Standby模式+共享存儲+ZooKeeper協調實現:
hdfs-site.xml中添加以下配置:<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/cluster1</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journalnode/data</value>
</property>
JournalNode負責同步Active NameNode的元數據修改,Standby NameNode通過讀取共享存儲保持與Active節點元數據一致。hdfs-site.xml中指定Active和Standby NameNode的本地元數據存儲路徑:<property>
<name>dfs.namenode.name.dir</name>
<value>/path/to/namenode/dir1,/path/to/namenode/dir2</value>
</property>
core-site.xml中設置HDFS的默認文件系統為nameservice(邏輯集群名),并指定ZooKeeper集群地址:<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>zoo1:2181,zoo2:2181,zoo3:2181</value>
</property>
hdfs-site.xml中定義nameservice下的NameNode節點(如namenode1、namenode2),并指定其RPC和HTTP地址:<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>namenode1,namenode2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.namenode1</name>
<value>namenode1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.namenode2</name>
<value>namenode2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.namenode1</name>
<value>namenode1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.namenode2</name>
<value>namenode2:50070</value>
</property>
hdfs-site.xml中開啟自動故障轉移功能:<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
hdfs --daemon start journalnode啟動JournalNode服務;hdfs namenode -format格式化元數據;hdfs --daemon start namenode;hdfs namenode -bootstrapStandby同步主節點元數據;hdfs --daemon start namenode。hdfs --daemon start zkfc,ZKFC會監控NameNode的健康狀態(通過ZooKeeper),當Active NameNode故障時,自動觸發Standby節點接管服務。ResourceManager負責YARN集群的資源調度,其高可用性通過主備ResourceManager+ZooKeeper協調實現:
core-site.xml中設置YARN的默認資源管理器地址:<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>zoo1:2181,zoo2:2181,zoo3:2181</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>resourcemanager1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>resourcemanager2</value>
</property>
yarn-site.xml中設置故障轉移策略(如基于ZooKeeper的自動故障轉移):<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.fencing.method</name>
<value>shell</value>
</property>
<property>
<name>yarn.resourcemanager.ha.fencing.script</name>
<value>/path/to/fence_script.sh</value>
</property>
fencing.script用于在故障轉移時隔離故障節點(如殺死殘留進程),避免腦裂問題。start-yarn.sh,備用ResourceManager會自動同步主節點狀態。通過yarn rmadmin -getServiceState rm1命令可查看ResourceManager狀態。hdfs dfsadmin -fetchImage命令定期將NameNode的元數據下載到本地或遠程存儲(如NFS、S3),確保元數據不會因節點故障丟失。hdfs-site.xml中設置dfs.replication(默認3副本),確保數據分布在多個DataNode上,即使某個節點故障,數據仍可從其他副本讀取。namenode進程,觀察Standby NameNode是否在幾秒內自動切換為Active狀態(通過jps命令查看進程狀態,或訪問NameNode Web UI確認)。resourcemanager進程,檢查備用ResourceManager是否自動接管服務(通過YARN Web UI查看ResourceManager狀態)。hdfs dfs -put/hdfs dfs -get命令測試),并確認集群會自動將該DataNode標記為“dead”,不再向其分配任務。