如何在 Ubuntu 上实现 Hadoop 高可用
小樊
33
2025-12-30 12:51:18
在 Ubuntu 上实现 Hadoop 高可用
一 架构与前置准备
- 架构要点
- HDFS HA:使用 QJM(Quorum Journal Manager) 共享编辑日志,配合 Zookeeper 与 ZKFC(ZooKeeperFailoverController) 实现 Active/Standby 自动故障切换。
- YARN HA:启用 ResourceManager HA,通过 Zookeeper 保存状态,实现 rm1/rm2 主备切换。
- 节点规划(示例三台,可按需扩展)
- master:NameNode、ResourceManager、ZKFC、JournalNode、DataNode
- slave1:NameNode、ResourceManager、ZKFC、JournalNode、DataNode
- slave2:JournalNode、DataNode(可按需部署 ZK)
- 基础环境
- 系统:Ubuntu 18.04/20.04/22.04
- 软件:JDK 1.8、Hadoop 3.x、Zookeeper 3.5+
- 前置:配置 /etc/hosts、SSH 免密、NTP 时间同步、关闭防火墙或放通端口(如 2181/8020/50070/8088/8485)。
二 安装与基础配置
- 安装 JDK 与 Hadoop
- 解压并设置环境变量(示例路径,按实际调整):
- JAVA_HOME:/opt/jdk1.8.0_xxx
- HADOOP_HOME:/opt/hadoop-3.x
- 在 /etc/profile 或 ~/.bashrc 中导出:JAVA_HOME、HADOOP_HOME、PATH,并执行
source 生效。
- 配置 SSH 免密
- 每台执行:
ssh-keygen -t rsa
- 分发公钥:
ssh-copy-id master、ssh-copy-id slave1、ssh-copy-id slave2
- 配置主机映射
- 编辑 /etc/hosts(示例):
- 192.168.1.10 master
- 192.168.1.11 slave1
- 192.168.1.12 slave2
- 时间同步
- 安装并启用 NTP:
sudo apt-get install ntp,编辑 /etc/ntp.conf 指向内网 NTP 或本地时钟源,启动服务并校验 ntpstat 同步状态。
三 部署 Zookeeper 集群
- 解压并配置 conf/zoo.cfg(三台一致):
- tickTime=2000、initLimit=10、syncLimit=5
- dataDir=/opt/zookeeper/data、clientPort=2181
- 集群地址(示例):server.1=master:2888:3888;server.2=slave1:2888:3888;server.3=slave2:2888:3888
- 初始化 myid
- master:
echo 1 > /opt/zookeeper/data/myid
- slave1:
echo 2 > /opt/zookeeper/data/myid
- slave2:
echo 3 > /opt/zookeeper/data/myid
- 启动与校验
- 每台执行:
/opt/zookeeper/bin/zkServer.sh start
- 校验:
/opt/zookeeper/bin/zkServer.sh status,应见到 leader/follower 角色。
四 Hadoop 高可用配置
- 公共与目录(建议在各节点一致)
- 在 etc/hadoop/hadoop-env.sh / yarn-env.sh 中设置 JAVA_HOME
- 在 core-site.xml 设置:
- fs.defaultFS:hdfs://mycluster
- hadoop.tmp.dir:/opt/hadoop-3.x/data
- ha.zookeeper.quorum:master:2181,slave1:2181,slave2:2181
- HDFS HA(etc/hadoop/hdfs-site.xml 关键项)
- 命名服务与 NN:
- dfs.nameservices:mycluster
- dfs.ha.namenodes.mycluster:nn1,nn2
- dfs.namenode.rpc-address.mycluster.nn1:master:8020
- dfs.namenode.rpc-address.mycluster.nn2:slave1:8020
- dfs.namenode.http-address.mycluster.nn1:master:50070
- dfs.namenode.http-address.mycluster.nn2:slave1:50070
- 共享编辑日志与故障隔离:
- dfs.namenode.shared.edits.dir:qjournal://master:8485;slave1:8485;slave2:8485/mycluster
- dfs.journalnode.edits.dir:/opt/hadoop-3.x/data/journal
- dfs.client.failover.proxy.provider.mycluster:org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
- dfs.ha.automatic-failover.enabled:true
- dfs.ha.fencing.methods:sshfence(可追加 shell(/bin/true))
- dfs.ha.fencing.ssh.private-key-files:/root/.ssh/id_rsa
- dfs.ha.fencing.ssh.connect-timeout:30000
- 数据与副本:
- dfs.replication:2~3
- dfs.namenode.name.dir:file://${hadoop.tmp.dir}/name
- dfs.datanode.data.dir:file://${hadoop.tmp.dir}/data
- YARN HA(etc/hadoop/yarn-site.xml 关键项)
- 启用 HA 与存储:
- yarn.resourcemanager.ha.enabled:true
- yarn.resourcemanager.cluster-id:yrc
- yarn.resourcemanager.ha.rm-ids:rm1,rm2
- yarn.resourcemanager.hostname.rm1:master
- yarn.resourcemanager.hostname.rm2:slave1
- yarn.resourcemanager.webapp.address.rm1:master:8088
- yarn.resourcemanager.webapp.address.rm2:slave1:8088
- yarn.resourcemanager.zk-address:master:2181,slave1:2181,slave2:2181
- yarn.resourcemanager.recovery.enabled:true
- yarn.resourcemanager.store.class:org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
- 计算与日志:
- yarn.nodemanager.aux-services:mapreduce_shuffle
- yarn.log-aggregation-enable:true
- yarn.log-aggregation.retain-seconds:604800
- MapReduce(etc/hadoop/mapred-site.xml)
- mapreduce.framework.name:yarn
- mapreduce.jobhistory.address:master:10020
- mapreduce.jobhistory.webapp.address:master:19888
- 从节点(etc/hadoop/workers 或 slaves)
五 启动与验证
- 首次初始化
- 启动 Zookeeper(三台):
/opt/zookeeper/bin/zkServer.sh start
- 格式化 ZKFC 状态:
hdfs zkfc -formatZK
- 启动 JournalNode(三台):
hdfs --daemon start journalnode
- 格式化 Active NameNode(在 nn1,如 master):
hdfs namenode -format
- 同步元数据到 Standby(在 nn2,如 slave1):先启动 namenode 进程,再执行
hdfs namenode -bootstrapStandby
- 启动集群
- 方式 A(推荐):
start-dfs.sh && start-yarn.sh
- 方式 B(逐项):在各 NN 启动 ZKFC:
hdfs --daemon start zkfc;在 rm2 启动 ResourceManager:yarn --daemon start resourcemanager
- 启动历史服务:
mapred --daemon start historyserver
- 验证与故障切换
- Web 检查:
- HDFS:http://master:50070 与 http://slave1:50070(应见 Active/Standby)
- YARN:http://master:8088 与 http://slave1:8088(切换后可用)
- 故障转移测试:
- 终止 Active NN:
kill -9 <nn_pid>;观察另一 NN 自动变为 Active
- 恢复故障 NN:启动后应为 Standby
- 常用命令
- 查看进程:
jps
- 手动切换(谨慎):
hdfs haadmin -failover --forcefence --forceactive nn1 nn2
- 查看状态:
hdfs haadmin -getServiceState nn1、yarn rmadmin -getServiceState rm1。