Hadoop HA高可用搭建2024(V3.3.6)

打印 上一主题 下一主题

主题 903|帖子 903|积分 2709

启动制止命令


启动服务

  1. cd /data/soft/hadoop/sbin
  2. hadoop-daemon.sh start journalnode
  3. ./start-all.sh
  4. mapred --daemon start historyserver
  5. yarn --daemon start timelineserver
复制代码

制止服务

  1. cd /data/soft/hadoop/sbin
  2. hadoop-daemon.sh stop journalnode
  3. ./stop-all.sh
  4. mapred --daemon stop historyserver
  5. yarn --daemon stop timelineserver
复制代码

HA 概述

HA 即高可用,在 Hadoop 中,只有 NN 和 MR 会出现单点故障。所以只需要对 NN 和 MR 做 HA
HA 原理就是额外起一台机子作冗余备份,当主机挂了,就让备机顶上。按照该想法会存在以下问题:

  • 主备间如何同步 Edit?
  • 如何检测主机下线?
  • 如何做故障转移?
对于问题一:Hadoop 引入 JournalNode 解决
对于问题二:使用 ZK 来检测呆板状态变化
对于问题三:Hadoop 引入 DFSZKFailoverController 解决
引入新的部件,为了防止这些也是是单点的,所以也得给他们起多个

集群规划

按照以上分析,便有以下集群规划
node01node02node03NameNodeNameNodeNameNodeDFSZKFailoverControllerDFSZKFailoverControllerDFSZKFailoverControllerJournalNodeJournalNodeJournalNodeDataNodeDataNodeDataNodeZKZKZKResourceManagerResourceManagerResourceManagerNodeManagerNodeManagerNodeManager
ZK 集群搭建

参考
ZooKeeper集群安装

Hadoop安装

Hadoop下载地址:
:::info


  • https://hadoop.apache.org/releases.html
  • https://archive.apache.org/dist/hadoop/common/(历史版本)
    :::
    将hadoop安装包"hadoop-3.4.0.tar.gz",拷贝到CentOS中
    将Hadoop压缩包,解压缩到安装目录下 :
  1. tar -zxvf /data/soft/hadoop-3.3.6.tar.gz
  2. mv hadoop-3.3.6 hadoop
  3. chown -R root:root ./hadoop
复制代码
打开"/etc/profile"配置文件,配置hadoop情况变量(注意,标点符号全都要是英文半角):
  1. export HADOOP_HOME=/data/soft/hadoop
  2. export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  3. export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
  4. export HADOOP_CLASSPATH=`hadoop classpath`
  5. #export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"
复制代码
实验"/etc/profile",让配置见效:
  1. source /etc/profile
复制代码
测试hadoop安装:
  1. hadoop version
复制代码

修改配置


hadoop-env.sh

修改hadoop-env.sh文件,设置运行情况变量及运行用户
  1. export JAVA_HOME=/data/soft/sdkman/candidates/java/current
  2. export HDFS_NAMENODE_USER=root
  3. export HDFS_DATANODE_USER=root
  4. export HDFS_SECONDARYNAMENODE_USER=root
  5. export YARN_RESOURCEMANAGER_USER=root
  6. export YARN_NODEMANAGER_USER=root
  7. export HDFS_JOURNALNODE_USER=root
  8. export HDFS_ZKFC_USER=root
复制代码

core-site.xml

   注意:
HA集群名称要和hdfs-site.xml中的配置保持一致
修改存储路径
Zookeeper集群的地址和端口
  1. <configuration>
  2.   <!-- HA集群名称,自定义,该值要和hdfs-site.xml中的配置保持一致  -->
  3.   <property>
  4.     <name>fs.defaultFS</name>
  5.     <value>hdfs://mycluster</value>
  6.   </property>
  7.   <!-- 指定hadoop运行时产生文件的存储路径 -->
  8.   <property>
  9.     <name>hadoop.tmp.dir</name>
  10.     <value>/data/apps/hadoop</value>
  11.   </property>
  12.   <!-- 设置HDFS web UI访问用户 -->
  13.   <property>
  14.     <name>hadoop.http.staticuser.user</name>
  15.     <value>root</value>
  16.   </property>
  17.   <!-- ZooKeeper集群的地址和端口-->
  18.   <property>
  19.     <name>ha.zookeeper.quorum</name>
  20.     <value>master:2181,slave1:2181,slave2:2181</value>
  21.   </property>
  22.   <!-- 配置该root允许通过代理访问的主机节点 -->
  23.   <property>
  24.     <name>hadoop.proxyuser.root.hosts</name>
  25.     <value>*</value>
  26.   </property>
  27.   <!-- 配置该root允许代理的用户所属组 -->
  28.   <property>
  29.     <name>hadoop.proxyuser.root.groups</name>
  30.     <value>*</value>
  31.   </property>
  32.   <!-- 配置该root允许代理的用户 -->
  33.   <property>
  34.     <name>hadoop.proxyuser.root.users</name>
  35.     <value>*</value>
  36.   </property>
  37. </configuration>
复制代码

hdfs-site.xml

   注意:
查抄节点之间是否可以免密登录
集群名称和core-site中保持一致
集群相关节点及属性name cluster名称记得替换
  1. <configuration>
  2.   <!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 -->
  3.   <property>
  4.     <name>dfs.nameservices</name>
  5.     <value>mycluster</value>
  6.   </property>
  7.   <!-- NameNode 数据存储目录 -->
  8.   <property>
  9.     <name>dfs.namenode.name.dir</name>
  10.     <value>file://${hadoop.tmp.dir}/name</value>
  11.   </property>
  12.   <!-- DataNode 数据存储目录 -->
  13.   <property>
  14.     <name>dfs.datanode.data.dir</name>
  15.     <value>file://${hadoop.tmp.dir}/data</value>
  16.   </property>
  17.   <!-- JournalNode 数据存储目录 -->
  18.   <property>
  19.     <name>dfs.journalnode.edits.dir</name>
  20.     <value>${hadoop.tmp.dir}/jn</value>
  21.   </property>
  22.   <!-- mycluster下面有3个NameNode,分别是nn1,nn2,nn3 -->
  23.   <property>
  24.     <name>dfs.ha.namenodes.mycluster</name>
  25.     <value>nn1,nn2,nn3</value>
  26.   </property>
  27.   <!-- nn1的RPC通信地址, http通信地址 -->
  28.   <property>
  29.     <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  30.     <value>master:8020</value>
  31.   </property>
  32.   <property>
  33.     <name>dfs.namenode.http-address.mycluster.nn1</name>
  34.     <value>master:9870</value>
  35.   </property>
  36.   <!-- nn2的RPC通信地址, http通信地址 -->
  37.   <property>
  38.     <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  39.     <value>slave1:8020</value>
  40.   </property>
  41.   <property>
  42.     <name>dfs.namenode.http-address.mycluster.nn2</name>
  43.     <value>slave1:9870</value>
  44.   </property>
  45.   <!-- nn3的RPC通信地址, http通信地址 -->
  46.   <property>
  47.     <name>dfs.namenode.rpc-address.mycluster.nn3</name>
  48.     <value>slave2:8020</value>
  49.   </property>
  50.   <property>
  51.     <name>dfs.namenode.http-address.mycluster.nn3</name>
  52.     <value>slave2:9870</value>
  53.   </property>
  54.   <!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
  55.   <property>
  56.     <name>dfs.namenode.shared.edits.dir</name>
  57.     <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
  58.   </property>
  59.   <!-- 开启NameNode失败自动切换 -->
  60.   <property>
  61.     <name>dfs.ha.automatic-failover.enabled</name>
  62.     <value>true</value>
  63.   </property>
  64.   <!-- 指定该集群出故障时,哪个实现类负责执行故障切换 -->
  65.   <property>
  66.     <name>dfs.client.failover.proxy.provider.mycluster</name>
  67.     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  68.   </property>
  69. <!-- 避免脑裂,配置隔离机制方法,即同一时刻只能有一台服务器对外响应-->
  70.   <property>
  71.     <name>dfs.ha.fencing.methods</name>
  72.     <value>sshfence</value>
  73.   </property>
  74.   <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
  75.   <property>
  76.     <name>dfs.ha.fencing.ssh.private-key-files</name>
  77.     <value>/root/.ssh/id_rsa</value>
  78.   </property>
  79.   <!-- 配置sshfence隔离机制超时时间 -->
  80.   <property>
  81.     <name>dfs.ha.fencing.ssh.connect-timeout</name>
  82.     <value>30000</value>
  83.   </property>
  84.   
  85. </configuration>
复制代码

mapred-site.xml

  1. <configuration>
  2.   <!-- 指定mr框架为yarn方式 -->
  3.   <property>
  4.     <name>mapreduce.framework.name</name>
  5.     <value>yarn</value>
  6.   </property>
  7.   <!-- 历史服务器端地址 -->
  8.   <property>
  9.     <name>mapreduce.jobhistory.address</name>
  10.     <value>master:10020</value>
  11.   </property>
  12.   <!-- 历史服务器 web 端地址 -->
  13.   <property>
  14.     <name>mapreduce.jobhistory.webapp.address</name>
  15.     <value>master:19888</value>
  16.   </property>
  17. </configuration>
复制代码

yarn-site.xml

  1. <configuration>
  2.   <!-- 开启RM高可用 -->
  3.   <property>
  4.     <name>yarn.resourcemanager.ha.enabled</name>
  5.     <value>true</value>
  6.   </property>
  7.   <!-- 指定RM的cluster id -->
  8.   <property>
  9.     <name>yarn.resourcemanager.cluster-id</name>
  10.     <value>yrc</value>
  11.   </property>
  12.   <!-- 指定RM的名字 -->
  13.   <property>
  14.     <name>yarn.resourcemanager.ha.rm-ids</name>
  15.     <value>rm1,rm2,rm3</value>
  16.   </property>
  17.   <!-- 分别指定RM的地址 -->
  18.   <!-- 指定 rm1 的主机名, web 端地址, 内部通信地址, 申请资源地址, NM 连接的地址 -->
  19.   <property>
  20.     <name>yarn.resourcemanager.hostname.rm1</name>
  21.     <value>master</value>
  22.   </property>
  23.   <property>
  24.     <name>yarn.resourcemanager.webapp.address.rm1</name>
  25.     <value>master:8088</value>
  26.   </property>
  27.   <property>
  28.     <name>yarn.resourcemanager.address.rm1</name>
  29.     <value>master:8032</value>
  30.   </property>
  31.   <property>
  32.     <name>yarn.resourcemanager.scheduler.address.rm1</name>
  33.     <value>master:8030</value>
  34.   </property>
  35.   <property>
  36.     <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
  37.     <value>maste:8031</value>
  38.   </property>
  39.   <!-- 指定 rm2 配置, web 端地址, 内部通信地址, 申请资源地址, NM 连接的地址 -->
  40.   <property>
  41.     <name>yarn.resourcemanager.hostname.rm2</name>
  42.     <value>slave1</value>
  43.   </property>
  44.   <property>
  45.     <name>yarn.resourcemanager.webapp.address.rm2</name>
  46.     <value>slave1:8088</value>
  47.   </property>
  48.   <property>
  49.     <name>yarn.resourcemanager.address.rm2</name>
  50.     <value>slave1:8032</value>
  51.   </property>
  52.   <property>
  53.     <name>yarn.resourcemanager.scheduler.address.rm2</name>
  54.     <value>slave1:8030</value>
  55.   </property>
  56.   <property>
  57.     <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
  58.     <value>slave1:8031</value>
  59.   </property>
  60.   <!-- 指定 rm3 配置, web 端地址, 内部通信地址, 申请资源地址, NM 连接的地址 -->
  61.   <property>
  62.     <name>yarn.resourcemanager.hostname.rm3</name>
  63.     <value>slave2</value>
  64.   </property>
  65.   <property>
  66.     <name>yarn.resourcemanager.webapp.address.rm3</name>
  67.     <value>slave2:8088</value>
  68.   </property>
  69.   <property>
  70.     <name>yarn.resourcemanager.address.rm3</name>
  71.     <value>slave2:8032</value>
  72.   </property>
  73.   <property>
  74.     <name>yarn.resourcemanager.scheduler.address.rm3</name>
  75.     <value>slave2:8030</value>
  76.   </property>
  77.   <property>
  78.     <name>yarn.resourcemanager.resource-tracker.address.rm3</name>
  79.     <value>slave2:8031</value>
  80.   </property>
  81.   <!-- 指定 zookeeper 集群的地址 -->
  82.   <property>
  83.     <name>yarn.resourcemanager.zk-address</name>
  84.     <value>master:2181,slave1:2181,slave2:2181</value>
  85.   </property>
  86.   <!-- 启用自动恢复 -->
  87.   <property>
  88.     <name>yarn.resourcemanager.recovery.enabled</name>
  89.     <value>true</value>
  90.   </property>
  91.   <!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 -->
  92.   <property>
  93.     <name>yarn.resourcemanager.store.class</name>
  94.     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  95.   </property>
  96.   <!-- 环境变量的继承 -->
  97.   <property>
  98.     <name>yarn.nodemanager.env-whitelist</name>
  99.     <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  100.   </property>
  101.   <!-- YARN 节点管理器将使用 MapReduce Shuffle 作为其辅助服务 -->
  102.   <property>
  103.     <name>yarn.nodemanager.aux-services</name>
  104.     <value>mapreduce_shuffle</value>
  105.   </property>
  106. </configuration>
复制代码

修改workers

  1. master
  2. slave1
  3. slave2
复制代码

同步配置到节点

  1. scp -r /data/soft/hadoop root@slave1:/data/soft
  2. scp -r /data/soft/hadoop root@slave2:/data/soft
复制代码

启动集群


启动Zookeeper

启动集群各个节点的Zookeeper服务
  1. cd /data/soft/zookeeper/bin
  2. ./zkServer.sh start
  3. ./zkServer.sh status
复制代码

启动JournalNode

启动集群每个节点监控NameNode的管理日志的JournalNode
  1. cd /data/soft/hadoop/sbin
  2. hdfs --daemon start journalnode
复制代码
  1. [root@master sbin]# jps
  2. 33816 Jps
  3. 33785 JournalNode
  4. 4506 QuorumPeerMain
复制代码
  注意:
启动后需要等待全部的子节点进程全部启动完成,否则格式化目录报错
  
格式化目录

格式化HDFS(仅需实验格式化一次),在master节点的终端窗口中,实验下面的命令:
  1. hdfs namenode -format
复制代码
成功示例

注:假如由于某些缘故原由需要从头重新配置集群,那么在重新格式化HDFS之前,先把各节点Haoop下的dfs目录删除。 这个目录是在hdfs-site.xml文件中本身指定的,其下有两个子目录name和data,重新格式化之前必须删除它们

启动进程,同步元数据信息

master节点的启动namenode
  1. hdfs --daemon start namenode
复制代码
在slave1和slave2上,同步master节点的元数据信息
  1. hdfs namenode -bootstrapStandby
复制代码
启动slave1和slave2的namenode进程
  1. hdfs --daemon start namenode
复制代码

初始化ZKFC

ZKFC用于监控active namenode节点是否挂掉,通知其它节点上的ZKFC强行杀死本身ZKFC节点上的namenode(防止其假死状态产生集群namenode脑裂的发生),然后推举出其他namenode为active节点。在Master节点实验
  1. hdfs zkfc -formatZK
复制代码

主节点上启动HDFS和Yarn

start-dfs.sh会自动启动DFSZKFailoverController
  1. start-dfs.sh
  2. start-yarn.sh
复制代码
手动在standby上手动启动备份的 resourcemanager
  1. yarn-daemon.sh start resourcemanager
复制代码

HA测试


测试访问web界面

  1. master:9870
  2. slave1:9870
  3. slave:9870
  4. #yarn集群地址
  5. master:8080/cluster
复制代码

集群操作是否正常

  1. hdfs dfsadmin -report
  2. hadoop fs -mkdir /test01
  3. hadoop fs -put workers /test01
  4. hadoop fs -ls /test01
复制代码

验证namenode工作状态

namenode主备之间同时只能有一个主对外提供服务即active可以操作,standby不可以操作


验证namenode故障转移

杀死namenode active节点进程
  1. jps |grep -i namenode
  2. kill 50305
  3. #重新启动
  4. hdfs --daemon start namenode
复制代码
当前active节点Slave2无法打开,检察节点2,可以看到节点2切换到active

假如未正常切换可以检察节点hadoop-root-zkfc-{node_name}.log日志报错

增补阐明


hadoop脚天职析


start-all.sh

   

  • libexec/hadoop-config.sh
  • start-dfs.sh
  • start-yarn.sh
  
Hadoop脑裂介绍

https://blog.csdn.net/alphonse_10/article/details/135593142

错误解决

NameNode全部为StandBy状态
:::info
集群配置了自动切换需要配置sshfence隔离机制,所以hdfs-site.xml中配置不能少
:::
集群active节点制止后无法自动切换到standby节点
检察hadoop-root-zkfc-{node_name}.log日志发现:
org.apache.hadoop.ha.SshFenceByTcpPort: Unable to create SSH session
com.jcraft.jsch.JSchException: invalid privatekey: [B@1610a65d
:::info
密钥的时候使用的openssh版本过高导致,其天生的密钥类似如下,而jsch版本低,剖析不了高版本的openssh天生的秘钥
:::

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表