Hadoop集群如何在Linux上实现高可用
导读:Linux上实现Hadoop高可用 一、架构要点 HDFS HA:部署两个 NameNode(Active/Standby),通过Quorum Journal Manager(QJM)共享编辑日志,使用ZooKeeper + ZKFail...
Linux上实现Hadoop高可用
一、架构要点
- HDFS HA:部署两个 NameNode(Active/Standby),通过Quorum Journal Manager(QJM)共享编辑日志,使用ZooKeeper + ZKFailoverController(ZKFC)实现自动故障转移与 fencing,避免脑裂;DataNode 同时向两个 NameNode 上报块位置,保证快速切换。QJM 通常由至少 3 个且为奇数的 JournalNode 组成,可容忍 (N-1)/2 个节点故障。启用 HA 后不再需要 SecondaryNameNode。
- YARN HA:部署两个 ResourceManager(Active/Standby),依赖 ZooKeeper 进行状态管理与自动故障转移,确保资源管理服务不中断。
二、环境与角色规划
- 基础要求:Linux 主机、统一主机名与 /etc/hosts、JDK 1.8+、SSH 免密、NTP 时间同步、关闭防火墙/SELinux(或放行端口),并部署ZooKeeper 集群(建议 3/5/7 节点)。
- 典型最小规划(示例):
- zk1/zk2/zk3:ZooKeeper
- nn1/nn2:NameNode(同时各运行 ZKFC)
- jn1/jn2/jn3:JournalNode(QJM)
- 其余节点:DataNode + NodeManager(可按需增加 JournalNode 提升容错)。
三、关键配置步骤
- 配置 core-site.xml(示例)
- 指定命名服务与 ZooKeeper:
- fs.defaultFS=hdfs://(如:hdfs://mycluster)
- ha.zookeeper.quorum=zk1:2181,zk2:2181,zk3:2181
- 指定命名服务与 ZooKeeper:
- 配置 hdfs-site.xml(示例)
- 命名服务与 NameNode 列表:
- dfs.nameservices=mycluster
- dfs.ha.namenodes.mycluster=nn1,nn2
- RPC 与 HTTP 地址:
- dfs.namenode.rpc-address.mycluster.nn1=nn1:8020,dfs.namenode.rpc-address.mycluster.nn2=nn2:8020
- dfs.namenode.http-address.mycluster.nn1=nn1:50070,dfs.namenode.http-address.mycluster.nn2=nn2:50070
- 共享编辑日志(QJM):
- dfs.namenode.shared.edits.dir=qjournal://jn1:8485; jn2:8485; jn3:8485/mycluster
- 自动故障转移与代理:
- dfs.ha.automatic-failover.enabled=true
- dfs.client.failover.proxy.provider.mycluster=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
- 隔离机制(防脑裂):
- dfs.ha.fencing.methods=sshfence(可叠加 shell(/bin/true) 作为兜底)
- dfs.ha.fencing.ssh.private-key-files=/home/hadoop/.ssh/id_rsa
- JournalNode 本地目录:
- dfs.journalnode.edits.dir=/data/hadoop/journal
- 命名服务与 NameNode 列表:
- 配置 yarn-site.xml(示例)
- 启用 RM HA:
- yarn.resourcemanager.ha.enabled=true
- yarn.resourcemanager.cluster-id=yarn-cluster
- yarn.resourcemanager.ha.rm-ids=rm1,rm2
- yarn.resourcemanager.hostname.rm1=rm1,yarn.resourcemanager.hostname.rm2=rm2
- yarn.resourcemanager.zk-address=zk1:2181,zk2:2181,zk3:2181
- 运行 MapReduce:
- mapreduce.framework.name=yarn
- yarn.nodemanager.aux-services=mapreduce_shuffle
- 启用 RM HA:
- 同步配置到所有节点,保持 nameservice 名称与地址一致。
四、初始化与启动顺序
- 启动 ZooKeeper 集群(所有 zk 节点)。
- 启动 JournalNode(jn1/jn2/jn3):
hdfs --daemon start journalnode。 - 格式化 Active NameNode:
hdfs namenode -format(仅首次)。 - 在另一台 NameNode 上引导 Standby:
hdfs namenode -bootstrapStandby。 - 初始化 ZKFC(在 nn1、nn2 上):
hdfs zkfc -formatZK。 - 启动 NameNode:
hdfs --daemon start namenode(两台)。 - 启动 ZKFC 守护进程:
hdfs --daemon start zkfc(两台)。 - 启动 ResourceManager(rm1、rm2):
yarn --daemon start resourcemanager。 - 启动 NodeManager 与 DataNode(各工作节点):
yarn --daemon start nodemanager,hdfs --daemon start datanode。 - 验证:
- HDFS Web:
http://nn1:50070与http://nn2:50070应显示 Active/Standby; - 执行
hdfs dfsadmin -report与yarn node -list检查集群健康; - 客户端使用 nameservice(如 hdfs://mycluster)进行读写,验证自动故障转移。
- HDFS Web:
五、验证与运维要点
- 故障转移演练:
- 计划内切换:
hdfs haadmin -failover --forcefence --forceactive nn1 nn2; - 模拟故障:在 Active NameNode 上
kill -9 < NN_PID>,观察 Standby 自动提升为 Active,并确认客户端无中断或仅短暂重试。
- 计划内切换:
- 脑裂防护:确保 fencing 方法配置正确且可用(如 sshfence 私钥可达),避免双 Active。
- 数据可靠性:QJM 写入需多数派确认,部署奇数个 JournalNode;定期检查 JournalNode 数据目录与磁盘空间。
- 日常巡检:
- ZooKeeper:
echo stat | nc zk1 2181查看 Mode/Connections; - HDFS:
hdfs haadmin -getServiceState nn1、hdfs dfsadmin -report; - YARN:
yarn rmadmin -getServiceState rm1、yarn node -list -all; - 日志:检查 NameNode、JournalNode、ZKFC、ResourceManager 日志异常。
- ZooKeeper:
- 常见排错:
- 端口不通(如 8020/8485/50070/8088)与防火墙/SELinux;
- SSH 免密未配置或权限错误导致 fencing 失败;
- ZooKeeper 会话超时或网络分区导致误切换;
- 客户端未使用 nameservice 地址导致无法享受自动切换。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Hadoop集群如何在Linux上实现高可用
本文地址: https://pptw.com/jishu/771114.html
