CentOS 7 搭建Hadoop HA 高可用完全分布式集群指南
- 实操笔记
- 2025-03-31
- 39热度
- 0评论
一、基础环境准备
点击这里查看。在已搭建 Hadoop 完全分布式集群基础之上搭建 HA 模式。
-
-
配置主机名解析
-
配置SSH免密登录
-
二、ZooKeeper 集群搭建
三、Hadoop HA 集群配置
1.核心配置文件
core-site.xml
<!-- 全局文件系统URI -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value> <!-- HDFS逻辑集群名 -->
</property>
<!-- 用于 Namenode、DataNode、Journalnode 等存放数据的公共目录,也可以分开指定 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/apps/hadoop-2.7.6/data/tmp</value>
</property>
<!-- 指定 ZooKeeper 集群的地址和端口 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
</property>
hdfs-site.xml
<!-- 高可用相关配置 -->
<!-- 指定 DateNode 存储 block 的副本数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value> <!-- 必须与core-site中的集群名一致 -->
</property>
<!-- 指定 NameNode 集群下的 NameNode 机器 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1 的RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop101:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop101:50070</value>
</property>
<!-- nn2 的RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop102:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop102:50070</value>
</property>
<!-- 指定 nn1 和 nn2 的元数据在 JournalNode 上的存储位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/mycluster</value>
</property>
<!-- 指定 JournalNode 的本地磁盘存储位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/apps/hadoop-2.7.6/data/journal</value>
</property>
<!-- 配置 mycluster 集群的 NameNode 失败时实现自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置 Client 的 failover 代理 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制,已使用 SSH 方式进行 NameNode 的切换 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 当故障切换时,SSH 免密登录 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- connect-timeout 链接超时 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
yarn-site.xml
<!-- 启动 HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 标识集群 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-cluster</value>
</property>
<!-- 指定两个 ResourceManager 的名称 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定 rm1 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop101</value>
</property>
<!-- 指定 rm2 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop102</value>
</property>
<!-- 指定 ZooKeeper 集群 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
</property>
<!-- 启动 NodeManager 时,server的加载方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
mapred-site.xml
<!-- 指定 MapReduce 在 YARN 上运行-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
slaves
hadoop101
hadoop102
hadoop103
hadoop-env.sh、mapred-env.sh、yarn-env.sh 文件中加入 JAVA_HOME
export JAVA_HOME=/opt/apps/jdk1.8.0_202
温馨提示
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
将上述所有配置文件远程复制到其他2台节点上。
# 将 hadoop101 上的所有核心配置文件远程复制到 hadoop102、hadoop103相应的目录下
[root@hadoop101 hadoop-2.7.6]# scp -r /opt/apps/hadoop-2.7.6/etc/hadoop/* hadoop102:/opt/apps/hadoop-2.7.6/etc/hadoop/
[root@hadoop101 hadoop-2.7.6]# scp -r /opt/apps/hadoop-2.7.6/etc/hadoop/* hadoop103:/opt/apps/hadoop-2.7.6/etc/hadoop/
2.格式化并启动集群
# 启动 JournalNode(所有节点):由于是第一次启动,在启动 hadoop 之前,需要先格式化 NameNode。格式化 NameNode 需要先启动 JournalNode(以后不必了),在3个节点上分别执行以下命令,启动 journalnode
[root@hadoop101 hadoop-2.7.6]# hadoop-daemon.sh start journalnode
[root@hadoop102 hadoop-2.7.6]# hadoop-daemon.sh start journalnode
[root@hadoop103 hadoop-2.7.6]# hadoop-daemon.sh start journalnode
# 需要先在3台节点上启动 Zookeeper 集群,再执行以下命令
# 格式化 HDFS(仅在 hadoop101 执行)之前,需要将3台节点上hadoop-2.7.6目录下的data、logs目录全部删除。
[root@hadoop101 hadoop-2.7.6]# hdfs namenode -format
# 将 hadoop101 节点格式化后的data文件夹远程复制到 hadoop102 节点的安装目录下
[root@hadoop101 hadoop-2.7.6]# scp -r ./data hadoop102:/opt/apps/hadoop-2.7.6
# 在 hadoop101 上执行 hdfs zkfc -formatZK,只需要执行一次,且仅在 hadoop101 节点上
[root@hadoop101 hadoop-2.7.6]# hdfs zkfc -formatZK
# 在 hadoop101 节点上执行以下命令,启动 HDFS 和 YARN
[root@hadoop101 hadoop-2.7.6]# start-dfs.sh
[root@hadoop101 hadoop-2.7.6]# start-yarn.sh
http://192.168.220.30:8088、
四、验证并测试集群
1.进程检查
# NameNode 节点应有进程
[root@hadoop101 hadoop-2.7.6]# jps | grep -E 'NameNode|JournalNode|DFSZKFailoverController'
[root@hadoop102 hadoop-2.7.6]# jps | grep -E 'NameNode|JournalNode|DFSZKFailoverController'
# DataNode 节点应有进程
[root@hadoop101 hadoop-2.7.6]# jps | grep -E 'DataNode|NodeManager'
[root@hadoop102 hadoop-2.7.6]# jps | grep -E 'DataNode|NodeManager'
[root@hadoop103 hadoop-2.7.6]# jps | grep -E 'DataNode|NodeManager'
2.HDFS HA测试
# 查看 NameNode 状态
[root@hadoop101 hadoop-2.7.6]# hdfs haadmin -getServiceState nn1
# 手动触发故障转移
[root@hadoop101 hadoop-2.7.6]# hdfs haadmin -transitionToActive --forcemanual nn2
3.YARN HA 测试
# 提交测试作业
[root@hadoop101 hadoop-2.7.6]# yarn jar /opt/apps/hadoop-2.7.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar pi 10 1000
# 查看 ResourceManager状态
[root@hadoop102 hadoop-2.7.6]# yarn rmadmin -getServiceState rm1