Hadoop HA (高可用) 配置与操作指南

1. 新建目录与解压 Hadoop

首先,在所有三台节点上创建用于安装 Hadoop 的新目录,并将 Hadoop 压缩包解压到该目录。

bash 复制代码
# 三台节点执行
mkdir /opt/module/hadoop-HA
tar -zxvf hadoop-3.1.4.tar.gz -C /opt/module/hadoop-HA
2. 配置环境变量

修改所有节点的 /etc/profile 文件,配置新的 HADOOP_HOME 路径,并使其生效。

bash 复制代码
# 在所有节点上编辑 /etc/profile
vim /etc/profile

# 找到之前的 HADOOP_HOME 并注释掉
# export HADOOP_HOME=/opt/module/hadoop-3.1.4

# 添加新的 HADOOP_HOME 路径
export HADOOP_HOME=/opt/module/hadoop-HA/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 使环境变量生效
source /etc/profile

# 验证是否成功
hadoop version
3. 修改 Hadoop 配置文件

master 节点上,进入 /opt/module/hadoop-HA/hadoop-3.1.4/etc/hadoop/ 目录,并修改以下配置文件。


hadoop-env.sh

指定 Hadoop 使用的 JDK 和运行各个守护进程的用户。

bash 复制代码
vim hadoop-env.sh
bash 复制代码
export JAVA_HOME=/opt/module/jdk1.8.0_261
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

core-site.xml

配置 HDFS 的通信地址、临时数据存储目录、代理用户和 ZooKeeper 集群地址。

bash 复制代码
vim core-site.xml
xml 复制代码
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluter</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-HA/hadoop-3.1.4/data/hadoop</value>
    </property>
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.users</name>
        <value>*</value>
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>master:2181,slave1:2181,slave2:2181</value>
    </property>
</configuration>

hdfs-site.xml

配置 HDFS 副本数、NameNode 和 DataNode 的数据目录、HA 相关设置,以及自动故障转移和 Fencing 机制。

bash 复制代码
vim hdfs-site.xml
xml 复制代码
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/opt/module/hadoop-HA/hadoop-3.1.4/data/hadoop/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.dir</name>
        <value>/opt/module/hadoop-HA/hadoop-3.1.4/data/hadoop/datanode</value>
    </property>
    <property>
        <name>dfs.nameservices</name>
        <value>mycluter</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.mycluter</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.mycluter.nn1</name>
        <value>master:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluter.nn1</name>
        <value>master:9870</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.mycluter.nn2</name>
        <value>slave1:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluter.nn2</name>
        <value>slave1:9870</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluter</value>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/module/hadoop-HA/hadoop-3.1.4/data/hadoop/journaldata</value>
    </property>
    <property>
        <name>dfs.ha.automatic-failover.enabled.mycluter</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.mycluter</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <name>dfs.permissions.enable</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
</configuration>

mapred-site.xml

配置 MapReduce 运行在 YARN 上,并指定历史服务的地址。

xml 复制代码
vim mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>master:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>master:19888</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
</configuration>

yarn-site.xml

配置 YARN 的高可用、ResourceManager 的标识符、ZooKeeper 地址、日志聚合和内存检查等。

xml 复制代码
vim yarn-site.xml

<configuration>
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>jyarn</value>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>master</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>slave1</value>
    </property>
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>master:2181,slave1:2181,slave2:2181</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>
    <property>
    <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>master:8188</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>
        <value>master:8130</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>slave1:8188</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm2</name>
        <value>slave1:8130</value>
    </property>
</configuration>

workers

指定集群中的所有 DataNode 主机名。

bash 复制代码
vim workers

master
slave1
slave2

4. 远程分发配置

将配置好的 Hadoop 目录从 master 节点分发到 slave1slave2 节点。

bash 复制代码
# 在 master 节点执行
scp -r /opt/module/hadoop-HA/hadoop-3.1.4 slave1:/opt/module/hadoop-HA/
scp -r /opt/module/hadoop-HA/hadoop-3.1.4 slave2:/opt/module/hadoop-HA/

5. 启动集群

按照以下顺序启动集群服务:

  1. 启动 ZooKeeper 集群:在所有节点上启动 ZooKeeper,并检查其状态。

    bash 复制代码
    # 在所有节点上执行
    zkServer.sh start
    zkServer.sh status

    正确状态应为一台 leader,其余为 follower

  2. 启动 JournalNode:在所有节点上启动 JournalNode。

    bash 复制代码
    # 在所有节点上执行
    hdfs --daemon.sh start journalnode
  3. 格式化 HDFS (仅首次) :在 master (nn1) 上格式化 HDFS 文件系统。

    bash 复制代码
    hdfs namenode -format
  4. 同步 NameNode :将 master 上的 NameNode 数据同步到 slave1

    bash 复制代码
    # 在 master 节点执行
    scp -r /opt/module/hadoop-HA/hadoop-3.1.4/data/hadoop/namenode slave1:/opt/module/hadoop-HA/hadoop-3.1.4/data/hadoop
  5. 格式化 ZKFC :在 master (nn1) 上格式化 ZKFC,以便 ZooKeeper 管理主备切换。

    bash 复制代码
    hdfs zkfc -formatZK
  6. 启动 NameNode 和 ZKFC :在 masterslave1 上分别启动 NameNode 和 ZKFC。

    bash 复制代码
    # 在 master 和 slave1 上执行
    hdfs --daemon.sh start namenode
    hdfs --daemon.sh start zkfc

    注意 :如果你想启动所有服务,可以使用 start-dfs.shstart-yarn.sh,但前提是所有配置和环境(例如 ssh 免密登录)都已正确设置。


成功运行图如下所示


注意我这配置yarn端口为8188而不是 8088

6. 故障转移测试
HDFS NameNode 故障转移
  1. 查看 NameNode 状态 :确认 nn1nn2 的状态。

    bash 复制代码
    hdfs haadmin -getAllServiceState
  2. 手动主备切换 :将 nn1 切换为 standbynn2 切换为 active

    bash 复制代码
    hdfs haadmin -failover nn1 nn2
  3. 模拟故障 :在 master 上杀死 NameNode 进程。

    bash 复制代码
    # 可以通过 `jps` 查看pid
    # 在 master 节点执行
    kill -9 (namenode pid)
  4. 验证自动切换 :再次查看 NameNode 状态,nn2 应该自动切换为 active

    bash 复制代码
    hdfs haadmin -getServiceState nn1 # 显示 standby 或拒绝连接
    hdfs haadmin -getServiceState nn2 # 显示 active
YARN ResourceManager 故障转移
  1. 查看 ResourceManager 状态

    bash 复制代码
    yarn rmadmin -getServiceState rm1
    yarn rmadmin -getServiceState rm2
  2. 模拟故障 :在 master 上杀死 ResourceManager 进程。

    bash 复制代码
    # 在 master 节点执行
    kill -9 (rm1)ResourceManager
  3. 验证自动切换 :再次查看 ResourceManager 状态,rm2 应该自动切换为 active

    bash 复制代码
    yarn rmadmin -getServiceState rm1 # 拒绝连接
    yarn rmadmin -getServiceState rm2 # active

7. 常见问题处理

如果遇到两个 NameNode 都处于 standby 状态,并且日志报错 Parent znode does not exist,说明 ZooKeeper 中的 HA 状态没有正确初始化。

解决方法:

  1. 检查 ZooKeeper :确保 ZooKeeper 服务已启动,并检查 znode 是否存在。

    bash 复制代码
    cd $ZOOKEEPER_HOME/bin
    ./zkCli.sh ls /
  2. 重新格式化 ZKFC :使用 -formatZK 标志重新初始化 ZKFC。

    bash 复制代码
    hdfs zkfc -formatZK
  3. 重启服务:确认操作成功后,重新启动 Hadoop 集群。

    bash 复制代码
    stop-all.sh
    start-all.sh
相关推荐
沧澜sincerely2 小时前
WSL2搭建Hadoop伪分布式环境
大数据·hadoop·搜索引擎
还是大剑师兰特3 小时前
Kafka 面试题及详细答案100道(66-80)-- 运维与部署
分布式·kafka·大剑师·kafka面试题
计算机编程小央姐9 小时前
【Spark+Hive+hadoop】基于spark+hadoop基于大数据的人口普查收入数据分析与可视化系统
大数据·hadoop·数据挖掘·数据分析·spark·课程设计
鲲志说10 小时前
数据洪流时代,如何挑选一款面向未来的时序数据库?IoTDB 的答案
大数据·数据库·apache·时序数据库·iotdb
没有bug.的程序员10 小时前
MVCC(多版本并发控制):InnoDB 高并发的核心技术
java·大数据·数据库·mysql·mvcc
nju_spy12 小时前
南京大学 - 复杂结构数据挖掘(一)
大数据·人工智能·机器学习·数据挖掘·数据清洗·南京大学·相似性分析
哈哈很哈哈12 小时前
Flink SlotSharingGroup 机制详解
java·大数据·flink
Insist75313 小时前
基于OpenEuler部署kafka消息队列
分布式·docker·kafka
岚天start13 小时前
Nginx配置中location和proxy_pass指令尾部是否带斜杠的区别
运维·nginx·centos·proxy_pass·location·uri·斜杠