Hadoop HA高可用搭建2024(V3.3.6)
启动停止命令
启动服务
cd /data/soft/hadoop/sbin hadoop-daemon.sh start journalnode ./start-all.sh mapred --daemon start historyserver yarn --daemon start timelineserver
停止服务
cd /data/soft/hadoop/sbin hadoop-daemon.sh stop journalnode ./stop-all.sh mapred --daemon stop historyserver yarn --daemon stop timelineserver
HA 概述
HA 即高可用,在 Hadoop 中,只有 NN 和 MR 会出现单点故障。所以只需要对 NN 和 MR 做 HA
HA 原理就是额外起一台机子作冗余备份,当主机挂了,就让备机顶上。按照该想法会存在以下问题:
- 主备间如何同步 Edit?
- 如何检测主机下线?
- 如何做故障转移?
对于问题一:Hadoop 引入 JournalNode 解决
对于问题二:使用 ZK 来检测机器状态变化
对于问题三:Hadoop 引入 DFSZKFailoverController 解决
引入新的部件,为了防止这些也是是单点的,所以也得给他们起多个
集群规划
按照以上分析,便有以下集群规划
node01 | node02 | node03 |
---|---|---|
NameNode | NameNode | NameNode |
DFSZKFailoverController | DFSZKFailoverController | DFSZKFailoverController |
JournalNode | JournalNode | JournalNode |
DataNode | DataNode | DataNode |
ZK | ZK | ZK |
ResourceManager | ResourceManager | ResourceManager |
NodeManager | NodeManager | NodeManager |
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压缩包,解压缩到安装目录下 :tar -zxvf /data/soft/hadoop-3.3.6.tar.gz mv hadoop-3.3.6 hadoop chown -R root:root ./hadoop
打开"/etc/profile"配置文件,配置hadoop环境变量(注意,标点符号全都要是英文半角):
export HADOOP_HOME=/data/soft/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop export HADOOP_CLASSPATH=`hadoop classpath` #export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"
执行"/etc/profile",让配置生效:
source /etc/profile
测试hadoop安装:
hadoop version
修改配置
hadoop-env.sh
修改hadoop-env.sh文件,设置运行环境变量及运行用户
export JAVA_HOME=/data/soft/sdkman/candidates/java/current export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root export HDFS_JOURNALNODE_USER=root export HDFS_ZKFC_USER=root
core-site.xml
注意:
HA集群名称要和hdfs-site.xml中的配置保持一致
修改存储路径
Zookeeper集群的地址和端口
fs.defaultFS hdfs://mycluster hadoop.tmp.dir /data/apps/hadoop hadoop.http.staticuser.user root ha.zookeeper.quorum master:2181,slave1:2181,slave2:2181 hadoop.proxyuser.root.hosts * hadoop.proxyuser.root.groups * hadoop.proxyuser.root.users *
hdfs-site.xml
注意:
检查节点之间是否可以免密登录
集群名称和core-site中保持一致
集群相关节点及属性name cluster名称记得替换
dfs.nameservices mycluster dfs.namenode.name.dir file://${hadoop.tmp.dir}/name dfs.datanode.data.dir file://${hadoop.tmp.dir}/data dfs.journalnode.edits.dir ${hadoop.tmp.dir}/jn dfs.ha.namenodes.mycluster nn1,nn2,nn3 dfs.namenode.rpc-address.mycluster.nn1 master:8020 dfs.namenode.http-address.mycluster.nn1 master:9870 dfs.namenode.rpc-address.mycluster.nn2 slave1:8020 dfs.namenode.http-address.mycluster.nn2 slave1:9870 dfs.namenode.rpc-address.mycluster.nn3 slave2:8020 dfs.namenode.http-address.mycluster.nn3 slave2:9870 dfs.namenode.shared.edits.dir qjournal://master:8485;slave1:8485;slave2:8485/mycluster dfs.ha.automatic-failover.enabled true dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.ha.fencing.methods sshfence dfs.ha.fencing.ssh.private-key-files /root/.ssh/id_rsa dfs.ha.fencing.ssh.connect-timeout 30000
mapred-site.xml
mapreduce.framework.name yarn mapreduce.jobhistory.address master:10020 mapreduce.jobhistory.webapp.address master:19888
yarn-site.xml
yarn.resourcemanager.ha.enabled true yarn.resourcemanager.cluster-id yrc yarn.resourcemanager.ha.rm-ids rm1,rm2,rm3 yarn.resourcemanager.hostname.rm1 master yarn.resourcemanager.webapp.address.rm1 master:8088 yarn.resourcemanager.address.rm1 master:8032 yarn.resourcemanager.scheduler.address.rm1 master:8030 yarn.resourcemanager.resource-tracker.address.rm1 maste:8031 yarn.resourcemanager.hostname.rm2 slave1 yarn.resourcemanager.webapp.address.rm2 slave1:8088 yarn.resourcemanager.address.rm2 slave1:8032 yarn.resourcemanager.scheduler.address.rm2 slave1:8030 yarn.resourcemanager.resource-tracker.address.rm2 slave1:8031 yarn.resourcemanager.hostname.rm3 slave2 yarn.resourcemanager.webapp.address.rm3 slave2:8088 yarn.resourcemanager.address.rm3 slave2:8032 yarn.resourcemanager.scheduler.address.rm3 slave2:8030 yarn.resourcemanager.resource-tracker.address.rm3 slave2:8031 yarn.resourcemanager.zk-address master:2181,slave1:2181,slave2:2181 yarn.resourcemanager.recovery.enabled true yarn.resourcemanager.store.class org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore yarn.nodemanager.env-whitelist JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME yarn.nodemanager.aux-services mapreduce_shuffle
修改workers
master slave1 slave2
同步配置到节点
scp -r /data/soft/hadoop root@slave1:/data/soft scp -r /data/soft/hadoop root@slave2:/data/soft
启动集群
启动Zookeeper
启动集群各个节点的Zookeeper服务
cd /data/soft/zookeeper/bin ./zkServer.sh start ./zkServer.sh status
启动JournalNode
启动集群每个节点监控NameNode的管理日志的JournalNode
cd /data/soft/hadoop/sbin hdfs --daemon start journalnode
[root@master sbin]# jps 33816 Jps 33785 JournalNode 4506 QuorumPeerMain
注意:
启动后需要等待全部的子节点进程全部启动完成,否则格式化目录报错
格式化目录
格式化HDFS(仅需执行格式化一次),在master节点的终端窗口中,执行下面的命令:
hdfs namenode -format
成功示例
注:如果因为某些原因需要从头重新配置集群,那么在重新格式化HDFS之前,先把各节点Haoop下的dfs目录删除。 这个目录是在hdfs-site.xml文件中自己指定的,其下有两个子目录name和data,重新格式化之前必须删除它们启动进程,同步元数据信息
在master节点的启动namenode
hdfs --daemon start namenode
在slave1和slave2上,同步master节点的元数据信息
hdfs namenode -bootstrapStandby
启动slave1和slave2的namenode进程
hdfs --daemon start namenode
初始化ZKFC
ZKFC用于监控active namenode节点是否挂掉,通知其它节点上的ZKFC强行杀死自己ZKFC节点上的namenode(防止其假死状态产生集群namenode脑裂的发生),然后选举出其他namenode为active节点。在Master节点执行
hdfs zkfc -formatZK
主节点上启动HDFS和Yarn
start-dfs.sh会自动启动DFSZKFailoverController
start-dfs.sh start-yarn.sh
手动在standby上手动启动备份的 resourcemanager
yarn-daemon.sh start resourcemanager
HA测试
测试访问web界面
master:9870 slave1:9870 slave:9870 #yarn集群地址 master:8080/cluster
集群操作是否正常
hdfs dfsadmin -report hadoop fs -mkdir /test01 hadoop fs -put workers /test01 hadoop fs -ls /test01
验证namenode工作状态
namenode主备之间同时只能有一个主对外提供服务即active可以操作,standby不可以操作
验证namenode故障转移
杀死namenode active节点进程
jps |grep -i namenode kill 50305 #重新启动 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生成的秘钥
:::