温馨提示×

如何在 Ubuntu 上实现 Hadoop 高可用

小樊
33
2025-12-30 12:51:18
栏目: 智能运维

在 Ubuntu 上实现 Hadoop 高可用

一 架构与前置准备

  • 架构要点
    • HDFS HA:使用 QJM(Quorum Journal Manager) 共享编辑日志,配合 ZookeeperZKFC(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.8Hadoop 3.xZookeeper 3.5+
    • 前置:配置 /etc/hostsSSH 免密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 masterssh-copy-id slave1ssh-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)
    • master
    • slave1
    • slave2。

五 启动与验证

  • 首次初始化
    • 启动 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:50070http://slave1:50070(应见 Active/Standby
      • YARN:http://master:8088http://slave1:8088(切换后可用)
    • 故障转移测试:
      • 终止 Active NN:kill -9 <nn_pid>;观察另一 NN 自动变为 Active
      • 恢复故障 NN:启动后应为 Standby
    • 常用命令
      • 查看进程:jps
      • 手动切换(谨慎):hdfs haadmin -failover --forcefence --forceactive nn1 nn2
      • 查看状态:hdfs haadmin -getServiceState nn1yarn rmadmin -getServiceState rm1

0