ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Hadoop HA高可用集群3.3.6搭建(详细教程)
[打印本页]
作者:
我爱普洱茶
时间:
2025-1-9 12:20
标题:
Hadoop HA高可用集群3.3.6搭建(详细教程)
前置环境
(1)下载:https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
(2)安装ZK Linux环境Zookeeper集群安装(详细教程)-CSDN博客
(3)确保SSH互通Centos集群一键免密登陆xssh脚本
部署规划
1.第一台呆板上传解压hadoop安装包
# 1.解压到指定路径
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -zxvf /opt/apk/hadoop-3.3.6.tar.gz -C /opt/
# 创建软链接
ln -s /opt/hadoop-3.3.6 /opt/apps/hadoop
# 2.配置环境变量
vi /etc/profile.d/my_env.sh
# 在末尾添加
# HADOOP_HOME
export HADOOP_HOME=/opt/apps/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 3.使修改后的文件生效
source /etc/profile
# 4.测试Hadoop是否安装成功
hadoop version
复制代码
2.目次准备
在bigdata01创建好,后面会分发给各个节点
像data1、data2...,本地目次可以配置多个,且每个目次存放内容雷同,增长了可靠性,并没有真正提高高可用性
# 创建目录结构
mkdir -p /opt/apps/hadoop/data1/tmp
mkdir -p /opt/apps/hadoop/data2/tmp
mkdir -p /opt/apps/hadoop/data1/data/journalnode
mkdir -p /opt/apps/hadoop/data1/data/namenode
mkdir -p /opt/apps/hadoop/data2/data/namenode
mkdir -p /opt/apps/hadoop/data1/data/datanode
mkdir -p /opt/apps/hadoop/data2/data/datanode
# 创建目录的所属用户组和用户
groupadd hadoop
useradd -m -g hadoop hadoop
# 更改hadoop目录的所有权
chown -R hadoop:hadoop /opt/hadoop-3.3.6
chmod -R 755 /opt/apps/hadoop/data1/
chmod -R 755 /opt/apps/hadoop/data2/
复制代码
3.集群配置
cd /opt/apps/hadoop/etc/hadoop
vi hadoop-env.sh
# 追加内容,日志路径配置修改该文件
export JAVA_HOME=/opt/apps/java
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
复制代码
下列配置,在<configuration>与</configuration>之间添加内容:
vi core-site.xml
<!-- 指定HDFS的通信地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定Hadoop临时数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/apps/hadoop/data1/tmp,/opt/apps/hadoop/data2/tmp</value>
</property>
<!-- 指定Hadoop日志的存储目录 -->
<property>
<name>hadoop.log.dir</name>
<value>/opt/apps/hadoop/data2/log/hadoop</value>
</property>
<!-- 配置ZooKeeper集群的地址列表,用于Hadoop高可用性(HA) -->
<property>
<name>ha.zookeeper.quorum</name>
<value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
</property>
<!-- 设置访问Hadoop Web界面时使用的静态用户名 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- 允许root用户代理任何主机上的请求,指定了哪些主机可以作为代理用户来提交作业 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<!-- 允许root用户代理任何组的用户 -->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
复制代码
vi hdfs-site.xml
<!-- 设置HDFS的副本数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- NameNode的元数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/apps/hadoop/data1/data/namenode,/opt/apps/hadoop/data2/data/namenode</value>
</property>
<!-- DataNode的数据存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/apps/hadoop/data1/data/datanode,/opt/apps/hadoop/data2/data/datanode</value>
</property>
<!-- 设置命名服务的名称,在 HDFS 中,nameservices 是一个逻辑名称,用于标识一组 NameNode 实例。它允许客户端和其他 HDFS 组件通过一个统一的名称来访问多个 NameNode,从而实现高可用性。 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- 配置高可用性NameNode -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- NameNode nn1 的 RPC 地址,默认值9000 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>bigdata01:8020</value>
</property>
<!-- NameNode nn1 的 HTTP 地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>bigdata01:9870</value>
</property>
<!-- NameNode nn2 的 RPC 地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>bigdata02:8020</value>
</property>
<!-- NameNode nn2 的 HTTP 地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>bigdata02:9870</value>
</property>
<!-- 共享edits日志的目录,在 HA 配置中,多个 NameNode 需要访问同一组edits日志,以确保它们之间的数据一致性。 -->
<!-- qjournal 是一种用于存储edits日志的机制。它允许多个 NameNode 通过一个共享的、可靠的日志系统来记录对文件系统的修改。qjournal 由多个 JournalNode 组成,这些 JournalNode 负责接收和存储来自 NameNode 的编辑日志。 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://bigdata01:8485;bigdata02:8485;bigdata03:8485/ns1</value>
</property>
<!-- JournalNode的edits日志存储目录,不支持多目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/apps/hadoop/data1/data/journalnode</value>
</property>
<!-- 启用自动故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置客户端故障转移代理提供者 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 禁用权限检查 -->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可,否则sshfence(host:port) -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<value>shell(/bin/true)</value>
</property>
<!-- SSH围栏使用的私钥文件 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.nn.not-become-active-in-safemode</name>
<value>true</value>
</property>
<!-- SSH连接超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
复制代码
vi yarn-site.xml
<!-- 启用YARN ResourceManager的高可用性(HA) -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 设置YARN集群的唯一标识符,自定义YARN高可用集群的标识符 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
</property>
<!-- 列出所有ResourceManager实例的ID,指定YARN高可用集群中每个ResourceManager的唯一标识符 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定第一个ResourceManager实例(rm1)的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>bigdata01</value>
</property>
<!-- 指定第二个ResourceManager实例(rm2)的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>bigdata02</value>
</property>
<!-- 指定ZooKeeper服务器地址,用于存储ResourceManager的状态信息 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
</property>
<!-- 配置NodeManager上的辅助服务,这里设置为MapReduce shuffle服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 启用日志聚合功能,将容器日志收集到HDFS中 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://bigdata01:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间(秒),这里是1天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 启用ResourceManager的恢复功能 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 指定ResourceManager状态存储的实现类,这里使用ZooKeeper作为存储 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 指定第一个ResourceManager实例(rm1)Web应用程序的地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>bigdata01:8088</value>
</property>
<!-- 指定第一个ResourceManager实例(rm1)调度器的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>bigdata01:8030</value>
</property>
<!-- 指定第一个ResourceManager 对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>bigdata01:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>bigdata01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>bigdata01:8033</value>
</property>
<!-- 指定第二个ResourceManager实例(rm2)Web应用程序的地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>bigdata02:8088</value>
</property>
<!-- 指定第二个ResourceManager实例(rm2)调度器的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>bigdata02:8030</value>
</property>
<!-- 指定第二个ResourceManager 对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>bigdata02:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>bigdata02:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>bigdata02:8033</value>
</property>
<!--环境变量通过从NodeManagers的容器继承的环境属性,对于MapReduce应用程序,除了 默认值 hadoop op_mapred_home 应被加入 外,还有如下属性值:-->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
复制代码
vi mapred-site.xml
<!-- 指定MapReduce框架使用的资源管理器名称,这里设置为YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 设置MapReduce JobHistory服务的地址,用于存储已完成作业的历史信息 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>bigdata01:10020</value>
</property>
<!-- 设置MapReduce JobHistory Web应用程序的地址,可以通过浏览器访问来查看作业历史记录 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>bigdata01:19888</value>
</property>
<!-- 为MapReduce Application Master设置环境变量,指定HADOOP_MAPRED_HOME路径 -->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=\${HADOOP_HOME}</value>
</property>
<!-- 为Map任务设置环境变量,指定HADOOP_MAPRED_HOME路径 -->
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=\${HADOOP_HOME}</value>
</property>
<!-- 为Reduce任务设置环境变量,指定HADOOP_MAPRED_HOME路径 -->
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=\${HADOOP_HOME}</value>
</property>
复制代码
vi workers
bigdata01
bigdata02
bigdata03
复制代码
4.分发文件到其他集群
[root@bigdata01 opt]# xsync -i "bigdata02 bigdata03" /opt/hadoop-3.3.6/
[root@bigdata01 opt]# xsync -i "bigdata02 bigdata03" /opt/apps/hadoop
[root@bigdata01 opt]# xsync -i "bigdata02 bigdata03" /etc/profile
[root@bigdata01 opt]# xcall -i "bigdata02 bigdata03" source /etc/profile
复制代码
5.启动Hadoop集群
5.1启动Zookeeper集群
[root@bigdata01 hadoop]# zkCluster start
复制代码
5.2启动JournalNode
在格式化 Hadoop 高可用集群的 HDFS 文件系统时,系统会向 Quorum Journal Manager 写入 EditLog。在首次启动之前,需要在虚拟机 bigdata01、bigdata02 和 bigdata03 上分别执行以下下令以启动 JournalNode
[root@bigdata01 hadoop]# xcall -i "bigdata01 bigdata02 bigdata03" hdfs --daemon start journalnode
复制代码
5.3格式化HDFS(Hadoop分布式文件系统)
在虚拟机bigdata01执行如下下令格式化Hadoop分布式文件系统HDFS
[root@bigdata01 hadoop]# hdfs namenode -format
复制代码
重新格式化NameNode步调
# 1.先停止集群的进程
stop-all.sh
# 1.删除所有的数据目录
xcall "rm -rf /opt/apps/hadoop/data1"
xcall "rm -rf /opt/apps/hadoop/data2"
xcall "rm -rf /opt/apps/hadoop/logs"
# 2.重新开始第五节启动集群步骤
复制代码
5.4FSImage文件同步
为了确保HDFS初次启动时两个NameNode节点上的FSImage文件保持划一,在虚拟机bigdata01上完成HDFS格式化后(此操作仅初始化虚拟机bigdata01的NameNode并天生FSImage文件),需要将天生的FSImage文件从bigdata01复制到bigdata02对应的目次中。
xsync -i "bigdata02" /opt/apps/hadoop/data1/data/namenode
xsync -i "bigdata02" /opt/apps/hadoop/data2/data/namenode
复制代码
5.5.格式化ZKFC
ZKFC(ZooKeeper Failover Controller)是Hadoop高可用性(HA)架构中的一个关键组件,重要用于NameNode的故障转移管理。在HDFS HA配置中,通常会部署两个NameNode节点来提供服务冗余,其中一个处于Active状态负责处理客户端请求,另一个则处于Standby状态作为备份。ZKFC的作用就是在主NameNode发生故障时主动切换到备用NameNode,从而保证系统的连续性和数据的划一性。
在虚拟机bigdata01执行如下下令格式化ZKFC
[root@bigdata01 logs]# hdfs zkfc -formatZK
复制代码
5.6.集群启动
[root@bigdata01 hadoop]# start-all.sh # 关闭命令stop-all.sh,QuorumPeerMain是zk的集群的启动类,需要执行zkCluster stop
复制代码
六、问题排查
直接进入日记目次 cd $HADOOP_HOME/logs ,可以看到节点的启动log文件举行排查
6.1Hadoop运行一段时间,NodeManager挂掉
检察hadoop-root-nodemanager-bigdata01.log如下图所示:
缘故原由:
(1)异常缘故原由为zookeeper的版本不适配,将zookeeper-3.4.6升级到apache-zookeeper-3.8.2-bin,此处问题解决。
(2)ResourceManager 对NodeManager暴露的地址.。NodeManager通过该地址向RM汇报心跳,领取任务等,默认与 0.0.0.0:8031举行通信。需要指定yarn-site.xml 增长如下设置
<!-- 指定第一个ResourceManager 对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>bigdata01:8031</value>
</property>
<!-- 指定第二个ResourceManager 对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>bigdata02:8031</value>
</property>
复制代码
6.2高可用节点默认指向节点2
可以把yarn-site.xml中rm1,rm2顺序,改成rm2,rm1,如下:
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm2,rm1</value>
</property>
复制代码
七、服务访问(需在访问主机添加hosts剖析)
7.1 检察yarn集群中的master节点
# 查看所有节点活动状态
[root@bigdata01 logs]# yarn rmadmin -getAllServiceState
bigdata01:8033 standby
bigdata02:8033 active
# 查看提交应用程序的列表
[root@bigdata01 logs]# yarn application -list
2025-01-06 10:22:06,267 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm2
Total number of applications (application-types: [], states: [SUBMITTED, ACCEPTED, RUNNING] and tags: []):0
Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
# 关闭bigdata02的yarn进程,自动切换活动节点
[root@bigdata02 ~]# yarn --daemon stop resourcemanager
复制代码
7.2访问resourcemanager(高可用)
http://bigdata01:8088/cluster
7.3访问节点namenode
http://192.168.26.22:9870/
7.4开启汗青日记服务器(bigdata01)
[root@bigdata01 hadoop]# mapred --daemon start historyserver
复制代码
http://bigdata01:19888/jobhistory
附录
附录一:编写Hadoop高可用集群脚本
不推荐利用start-all.sh下令,后续的Spark、hive有雷同下令冲突
#!/bin/bash
# chmod a+x /usr/local/bin/haCluster
if [ $# -lt 1 ]
then
echo "No Args Input!"
exit;
fi
case $1 in
"start")
echo -e "\n================= 启动 hadoop集群 ================="
echo " ------------------- 启动 hdfs --------------------"
$HADOOP_HOME/sbin/start-dfs.sh
echo " ------------------- 启动 yarn --------------------"
$HADOOP_HOME/sbin/start-yarn.sh
echo " --------------- 启动 historyserver ---------------"
echo "Starting historyserver on [bigdata01]"
ssh bigdata01 "$HADOOP_HOME/bin/mapred --daemon start historyserver"
echo -e "\n"
;;
"stop")
echo -e "\n================= 关闭 hadoop集群 ================="
echo " --------------- 关闭 historyserver ---------------"
echo "Stopping historyserver on [bigdata01]"
ssh bigdata01 "$HADOOP_HOME/bin/mapred --daemon stop historyserver"
echo " ------------------- 关闭 yarn --------------------"
$HADOOP_HOME/sbin/stop-yarn.sh
echo " ------------------- 关闭 hdfs --------------------"
$HADOOP_HOME/sbin/stop-dfs.sh
echo -e "\n"
;;
*)
echo "Input Args Error!"
;;
esac
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4