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”,不再向其分配任务。