Ubuntu Hadoop 高可用性怎么配置
小樊
45
2026-01-03 10:31:16
Ubuntu Hadoop 高可用配置步骤
一 架构与前置准备
- 架构要点
- HDFS HA:使用 QJM(Quorum Journal Manager) 共享编辑日志,至少部署 3 台 JournalNode;两台 NameNode(Active/Standby) 通过 ZooKeeper + ZKFC 实现自动故障转移。
- YARN HA:部署两台 ResourceManager,启用 ZKRMStateStore 持久化状态,实现 Active/Standby 自动切换。
- 节点规划示例(可按需增减 DataNode/NodeManager)
- node1:NameNode1、ZooKeeper、JournalNode、ResourceManager1
- node2:NameNode2、ZooKeeper、JournalNode、ResourceManager2
- node3:DataNode、ZooKeeper、JournalNode、NodeManager
- node4:DataNode、NodeManager
- 前置条件
- Ubuntu 20.04/22.04、JDK 1.8、Hadoop 2.7.x/3.x、ZooKeeper 3.4.x/3.5.x+
- 完成 /etc/hosts 主机名映射、SSH 免密登录(主备 NN 需能互相免密)、关闭防火墙或放通端口(如 8020/50070/8088/2181/8485)。
二 核心配置
- 环境变量(所有节点)
- 在 ~/.bashrc 或 /etc/profile 中设置:
- export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
- export HADOOP_HOME=/opt/hadoop
- export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- core-site.xml(所有节点)
- 关键项:指定 nameservice、ZooKeeper 地址、临时目录
- fs.defaultFShdfs://mycluster
- hadoop.tmp.dir/opt/hadoop/data
- ha.zookeeper.quorumnode1:2181,node2:2181,node3:2181
- hdfs-site.xml(所有节点)
- 关键项:启用 HA、配置 QJM、ZKFC、fencing
- dfs.nameservicesmycluster
- dfs.ha.namenodes.myclusternn1,nn2
- dfs.namenode.rpc-address.mycluster.nn1node1:8020
- dfs.namenode.rpc-address.mycluster.nn2node2:8020
- dfs.namenode.http-address.mycluster.nn1node1:50070
- dfs.namenode.http-address.mycluster.nn2node2:50070
- dfs.namenode.shared.edits.dirqjournal://node1:8485;node2:8485;node3:8485/mycluster
- dfs.journalnode.edits.dir/opt/hadoop/journal
- dfs.client.failover.proxy.provider.myclusterorg.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
- dfs.ha.automatic-failover.enabledtrue
- dfs.ha.fencing.methodssshfence
- dfs.ha.fencing.ssh.private-key-files/root/.ssh/id_rsa
- dfs.ha.fencing.ssh.connect-timeout30000
- dfs.replication2
- dfs.namenode.name.dirfile:///opt/hadoop/dfs/name
- dfs.datanode.data.dirfile:///opt/hadoop/dfs/data
- yarn-site.xml(所有节点)
- 关键项:启用 YARN HA、ZK 状态存储
- yarn.resourcemanager.ha.enabledtrue
- yarn.resourcemanager.cluster-idyrc
- yarn.resourcemanager.ha.rm-idsrm1,rm2
- yarn.resourcemanager.hostname.rm1node1
- yarn.resourcemanager.hostname.rm2node2
- yarn.resourcemanager.zk-addressnode1:2181,node2:2181,node3:2181
- yarn.nodemanager.aux-servicesmapreduce_shuffle
- yarn.log-aggregation-enabletrue
- yarn.log-aggregation.retain-seconds86400
- yarn.resourcemanager.recovery.enabledtrue
- yarn.resourcemanager.store.classorg.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
- workers(或 slaves,所有节点)
- 列出所有 DataNode/NodeManager 主机名:
- 配置分发
- 将 $HADOOP_HOME/etc/hadoop 同步到所有节点,保持一致性。
三 启动与初始化
- 启动 ZooKeeper(所有 ZK 节点)
- $ zkServer.sh start
- $ zkServer.sh status(确认 1 个 leader + 多个 follower)
- 启动 JournalNode(所有 JN 节点)
- $ hadoop-daemon.sh start journalnode(Hadoop 2.x)
- 或 $ hdfs --daemon start journalnode(Hadoop 3.x)
- 格式化 ZooKeeper ZNode(任一 NameNode 节点)
- 格式化 NameNode(nn1)
- 启动 nn1 NameNode
- $ hadoop-daemon.sh start namenode(或 hdfs --daemon start namenode)
- 在 nn2 引导并启动
- $ hdfs namenode -bootstrapStandby
- $ hadoop-daemon.sh start namenode
- 启动 ZKFC(两台 NameNode)
- $ hadoop-daemon.sh start zkfc(或 hdfs --daemon start zkfc)
- 启动 DataNode/NodeManager(所有工作节点)
- $ hadoop-daemon.sh start datanode(或 hdfs --daemon start datanode)
- $ yarn-daemon.sh start nodemanager(或 yarn --daemon start nodemanager)
- 启动 ResourceManager(两台 RM)
- $ yarn-daemon.sh start resourcemanager(或 yarn --daemon start resourcemanager)
- 一键启动(可选)
- $ start-all.sh(Hadoop 2.x;Hadoop 3.x 建议按组件逐步启动以便排错)
四 验证与故障切换
- 进程与状态检查
- $ jps(应看到 NameNode/DataNode/JournalNode/ZKFC/ResourceManager/NodeManager)
- $ hdfs haadmin -getServiceState nn1、hdfs haadmin -getServiceState nn2(应一 active 一 standby)
- $ yarn rmadmin -getServiceState rm1、yarn rmadmin -getServiceState rm2
- Web UI
- HDFS:http://node1:50070、http://node2:50070
- YARN:http://node1:8088、http://node2:8088
- 故障转移测试
- 终止 Active NameNode 进程(如 kill -9),观察另一台 Standby 自动切换为 Active
- 恢复被终止的 NameNode,其将回到 Standby 状态
- 对 ResourceManager 执行相同 kill 测试,验证 YARN HA 切换
五 常见问题与排错要点
- 两个 NameNode 都是 Standby
- 检查 ZooKeeper 是否健康、ZKFC 是否启动、端口 2181/8020/50070/8485 是否可达;确认 dfs.ha.automatic-failover.enabled=true 且 fencing 配置正确(如 sshfence 私钥路径)。
- 自动切换不生效
- 确认 hdfs zkfc -formatZK 已执行;检查 core-site.xml 的 ha.zookeeper.quorum 与 hdfs-site.xml 的 nameservice/HA 地址 一致;查看 zkfc 与 JournalNode 日志定位异常。
- JournalNode 无法启动或写入失败
- 检查 dfs.journalnode.edits.dir 目录权限与磁盘空间;确认 QJM 地址端口(默认 8485)未被占用且防火墙已放通;确保 JournalNode 数量为 奇数且 ≥3 以保证写入多数派提交。
- 端口与主机名解析
- 统一 /etc/hosts 映射;避免 localhost 与主机名混用;必要时在 core-site.xml 设置 dfs.namenode.rpc-address 与 dfs.namenode.http-address 为实际主机名与端口。