前置环境
(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
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企服之家,中国第一个企服评测及商务社交产业平台。 |