Ubuntu下HDFS如何配置高可用性
小樊
45
2025-11-29 03:24:48
Ubuntu下HDFS高可用性配置指南
一 架构与前置准备
- 架构要点
- 部署2 台 NameNode(nn1/nn2)实现Active/Standby,通过QJM(Quorum Journal Manager)共享编辑日志,至少3 个 JournalNode(奇数)保障可用性;启用ZooKeeper + ZKFC实现自动故障转移;DataNode 同时向两台 NameNode 上报块信息。HA 模式下不再需要 SecondaryNameNode。建议将 ZooKeeper 与 JournalNode 分布在至少 3 台机器上,生产常见为 5 台节点(2 台 NN + 3 台 JN/ZK)。
- 环境与网络
- 安装 OpenJDK 8、配置 SSH 免密、统一 /etc/hosts 主机名映射、确保节点间网络互通;如启用防火墙,放行 8020/8485/9870/2181 等端口(或临时关闭以便部署)。
- 基础安装与目录
- 下载并解压 Hadoop(如 3.3.x),设置环境变量(JAVA_HOME、HADOOP_HOME、PATH),创建本地目录:dfs.namenode.name.dir、dfs.datanode.data.dir、dfs.journalnode.edits.dir。
二 配置步骤
- 安装并启动 ZooKeeper 集群(3 台或 5 台)
- 配置 zoo.cfg 的 server 列表,启动每台节点的 ZooKeeper 服务,验证集群状态(如 zkServer.sh status)。
- 配置 HDFS 核心与 HA 参数
- core-site.xml:设置 fs.defaultFS=hdfs://(如 hdfs://mycluster),以及 ha.zookeeper.quorum=zk1:2181,zk2:2181,zk3:2181。
- hdfs-site.xml:设置 dfs.nameservices、dfs.ha.namenodes.(如 nn1,nn2)、各 NameNode 的 rpc-address 与 http-address、dfs.namenode.shared.edits.dir=qjournal://jn1:8485;jn2:8485;jn3:8485/、dfs.journalnode.edits.dir、dfs.client.failover.proxy.provider.(如 ConfiguredFailoverProxyProvider)、dfs.ha.automatic-failover.enabled=true、dfs.ha.fencing.methods=sshfence 与 dfs.ha.fencing.ssh.private-key-files。
- 同步配置到所有节点
- 将 Hadoop 配置目录分发到 nn1、nn2、jn1/2/3 等所有节点,保持一致性。
- 启动 JournalNode 并初始化共享编辑日志
- 在每台 JournalNode 上执行:hdfs --daemon start journalnode;在 nn1 上执行 hdfs namenode -format 初始化元数据;随后在 nn1 上启动 NameNode(hdfs --daemon start namenode),在 nn2 上执行 hdfs namenode -bootstrapStandby 同步元数据并启动 NameNode。
- 初始化并启动自动故障转移
- 在任一 NameNode 上执行:hdfs zkfc -formatZK 初始化 ZK 故障转移根节点;启动 ZKFC(hdfs --daemon start zkfc)。
- 启动 DataNode
- 在各 DataNode 上执行:hdfs --daemon start datanode。
- 验证
- 使用 hdfs dfsadmin -report 查看节点与容量;访问 http://:9870 查看 NameNode Web UI 与 HA 状态;执行 hdfs haadmin -getServiceState nn1 与 nn2 确认 Active/Standby。
三 关键配置示例
- core-site.xml
- 设置默认文件系统为 nameservice:fs.defaultFS=hdfs://mycluster
- 指定 ZooKeeper 仲裁:ha.zookeeper.quorum=zk1:2181,zk2:2181,zk3:2181
- hdfs-site.xml(按 nameservice=mycluster,nn1/nn2)
- 命名服务与 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:9870
- dfs.namenode.http-address.mycluster.nn2=nn2:9870
- 共享编辑日志与本地目录:
- dfs.namenode.shared.edits.dir=qjournal://jn1:8485;jn2:8485;jn3:8485/mycluster
- dfs.journalnode.edits.dir=/var/lib/hadoop/journal
- 客户端故障转移代理与自动切换:
- dfs.client.failover.proxy.provider.mycluster=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
- dfs.ha.automatic-failover.enabled=true
- 隔离与 SSH fencing:
- dfs.ha.fencing.methods=sshfence
- dfs.ha.fencing.ssh.private-key-files=/home/hadoop/.ssh/id_rsa
- 数据存储与副本(示例):
- dfs.namenode.name.dir=/var/lib/hadoop/namenode
- dfs.datanode.data.dir=/var/lib/hadoop/datanode
- dfs.replication=3
- 说明:上述键名与语义与 Hadoop HA 的标准配置一致,包含 nameservices/namenode IDs、QJM 地址、自动故障转移与fencing等关键项。
四 运维与验证
- 常用命令
- 查看状态:hdfs dfsadmin -report;hdfs haadmin -getServiceState nn1 / nn2
- 手动切换(慎用):hdfs haadmin -failover --forcefence --forceactive nn2 nn1
- 启动/停止:start-dfs.sh / stop-dfs.sh;单进程:hdfs --daemon {start|stop} namenode/journalnode/datanode/zkfc
- 故障排查要点
- 无法选出 Active:检查 ZooKeeper 仲裁、ZKFC 是否运行、网络与防火墙、fencing 方法与密钥是否可用。
- EditLog 不同步:确认 JournalNode 多数派存活(3/5 至少 2 台)、共享编辑目录权限与磁盘空间、NameNode 与 JN 时钟同步。
- 客户端连不通:核对 fs.defaultFS 为 nameservice、客户端 core-site.xml/hdfs-site.xml 与集群一致、端口(如 8020/9870)可达。