博客 大数据 | Hadoop HA高可用搭建保姆级教程

大数据 | Hadoop HA高可用搭建保姆级教程

   数栈君   发表于 2023-06-06 11:11  234  0

集群准备🍟
这是我们本次搭建要完成的集群规划,也就是我们的,终极目标(The ultimate goal)。

2.1 集群规划
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/5387edd7754b818c25af66f80645311c..png


也就是说,总共有hadoop102,hadoop103,hadoop104,hadoop105四个节点。先来一张搭建好的图证明一下我搭建好了:

停止集群
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/561b0218dc3cc4af2845f7995bcbe409..png

启动集群
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/838b08d2431024927b59daa8a14f1c3a..png


查看集群规划是否符合预期
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/ed5e2d4bbf8039e6aaf88235094bf182..png


2.2 集群解释
NN-1
NameNode节点1,在 core-site.xml 文件中配置。

<!-- mycluster是集群名称,值是集群中的所有namenodes -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
1
2
3
4
5
NN-2
NameNode节点2,也是在 core-site.xml 文件中配置。

DN
DataNode,在workers中配置。 workers中的主机名要提前在/etc/hosts文件中做好主机名与IP的映射。


ZK
Zookeeper,在 zoo.cfg 文件中配置。 注意要将 zoo_sample.cfg 文件改名为 zoo.cfg,这个文件在 zookeeper 目录的 conf 目录下。不需要启动Zookeeper的节点,不需要配置进来。

ZKFC
ZKFailOverController,不需要主动配置,哪里的NameNode正常启动了ZKFC就会启动。 ZKFailOverController是Hadoop中通过ZK实现FC(故障转移)功能的一个实用工具。

JNN
JournalNode,在需要启动的节点上启动,仅第一次启动Hadoop时需要手动启动,后面都不需要手动启动。

三、说明🔑
3.1 主机名说明
据了解,很多朋友使用的四个节点的名称 并不是 hadoop102,hadoop103,hadoop104,hadoop105 ,有是master、slave1,slave2,slave3的;有namenode,datanode1,datanode2,datanode3的。没关系,只是主机名不一样而已! 只需要将对应的地方修改一下,就可以。(如果你足够熟练,就知道哪些地方要用自己的主机名)

3.2 用户名说明
在搭建过程中,我也没有使用 root 账号,使用的是一个可以执行 sudo 命令的普通用户账号。

为什么不使用root账号?

试问一下大家,如果你在公司上班,如果你不是运维人员,只是普通的开发人员,你可以拿到root账号的权限吗?显然是不可以的,我认为我们在平时的训练中就要养成使用普通用户账号的习惯,实际操作中才能游刃有余。(类似于接受自己的平庸哈哈哈)

3.3 操作目录说明
所有操作均在 /opt/module/HA 目录下,当然如果需要修改环境变量就要切换到 /etc/profile.d/ 目录下。

3.3 必要工具说明
这里使用到的就是VMware(安装虚拟机),XShell(远程连接工具)、Xftp(文件传输工具)。

至此,我们的需求、要求以及硬件设备就准备好了。下面开始准备软件吧!

四、上传资料🌵
磨刀不误砍柴工!充分的准备可以让我们的搭建过程事半功倍,流畅无比! ,而且,这也是减少返工(软件工程中的名词)的重要条件,大家一定要做好哦!

4.1 资料准备
这里用到的安装包有:jdk-8u202-linux-x64.tar.gz,点我下载jdk,hadoop-3.1.3.tar.gz,点我下载hadoop,apache-zookeeper-3.5.7-bin.tar.gz。点我下载Zookeeper,如果没有这些文件的可以私信我获取,我都上传到百度网盘了。

4.2 脚本准备
这里,我主要使用到了分发脚本(脚本名xsync),Hadoop HA一键启动脚本(脚本名myHA),查看所有节点jps进程脚本(脚本名jpsall)。

脚本的使用之前有提到过,这里不再赘述,大家可以参考我的这篇文章或其他文章:hadoop集群启停脚本分享。

下面是脚本内容,需要注意的是如果你的主机名和我不同,记得修改文中代码!

xsync
#! /bin/bash

# 1.判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Argument!
exit;
fi

# 2.遍历所有集群机器
for host in hadoop102 hadoop103 hadoop104 hadoop105
do
echo ==================== $host ===================
# 3.遍历所有目录,挨个发送

for file in $@
do
# 4.判断文件是否存在
if [ -e $file ]
then
# 5.获取父目录
pdir=$(cd -P $(dirname $file); pwd)

# 6.获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done

myHA
#! /bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit;
fi


case $1 in
"start"){
echo "----------启动zookeeper----------"
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 启动 ------------
ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh start"
done
echo "---------- 启动hdfs------------"
ssh hadoop102 "/opt/module/HA/hadoop-3.1.3/sbin/start-dfs.sh"
echo "---------- hadoop HA启动成功------------"
};;
"stop"){
echo "----------关闭hdfs----------"
ssh hadoop102 "/opt/module/HA/hadoop-3.1.3/sbin/stop-dfs.sh"
echo "----------关闭zookeeper----------"
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 停止 ------------
ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh stop"
done
echo "---------- hadoop HA停止成功------------"
};;
"status"){
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 状态 ------------
ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh status"
done
};;
*)
echo "Input Args Error"
;;
esac

jpsall
#! /bin/bash

for host in hadoop102 hadoop103 hadoop104 hadoop105
do
echo ----------$host----------
ssh $host jps
done

4.3 配置文件准备
由于篇幅原因,这里不展示配置文件的具体内容,但是却是非常重要,重中之重,大家可以私信我获取!这是搭建HA高可用中的关键,是减少我们遇到 报错风暴 的必由之路。

这里要用到的配置文件有:core-site.xml,hdfs-site.xml,hadoop-env.sh,workers,yarn-site.xml,mapred-site.xml(都在hadoop/etc/hadoop目录下)zoo.cfg(zookeeper/conf/目录下),my_env.sh(/etc/profile.d/目录下),共8个文件。

这8个配置文件均已上传百度网盘!点我获取资料。

至此,我们的资料也准备好了!

五、解压与修改文件🍉
5.1 解压软件包
将上述我们准备好的Zookeeper、Hadoop、JDK软件包通过Xshell+Xftp上传到 /opt/software 目录下,并解压到 /opt/module/HA 目录下。



上传文件过程请大家自己完成哦!下面是解压过程:(该过程只需要在一台节点上完成即可,我这里使用的hadoop102,其他的节点后面使用克隆)。

创建HA目录
mkdir /opt/module/HA
1
解压JDK
tar -xzvf /opt/software/jdk-8u202-linux-x64.tar.gz -C /opt/module/HA/
1
解压Hadoop
tar -xzvf /opt/software/hadoop-3.1.3.tar.gz -C /opt/module/HA/
1
解压Zookeeper
tar -xzvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/HA/
1
重命名Zookeeper
mv apache-zookeeper-3.5.7-bin/ zookeeper
1
重命名JDK
mv jdk1.8.0_202/ jdk1.8
1
5.2 修改配置文件
hadoop目录下的文件共六个,在资料中已经给出,下面仅展示一部分要特别注意的配置文件。

1.core-site.xml

2.hdfs-site.xml

3.hadoop-env.sh

4.workers

hadoop103
hadoop104
hadoop105
1
2
3
5.yarn-site.xml
6.mapre-site.xml
zookeeper目录下的文件

1.zoo.cfg
server.1=hadoop103:2888:3888
server.2=hadoop104:2888:3888
server.3=hadoop105:2888:3888
1
2
3
2.myid
这个节点上没有使用Zookeeper,所以未使用myid文件。

/etc/profile.d目录下的文件

my_env.sh
# JAVA_HOME
# 只需修改java_home 因人而异 是自己的jdk安装目录
export JAVA_HOME=/opt/module/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin

# HADOOP_HOME
# 同理 这里只需修改Hadoop_home,是Hadoop安装目录
export HADOOP_HOME=/opt/module/HA/hadoop-3.1.3

export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

export HDFS_NAMENODE_USER=sky
export HDFS_DATANODE_USER=sky
export HDFS_SECONDARYNAMENODE_USER=sky
export YARN_RESOURCEMANAGER_USER=sky
export YARN_NODEMANAGER_USER=sky

# ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/HA/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin


之后记得刷新环境变量:

source /etc/profile.d/my_env.sh
1
5.3 创建目录
创建Hadoop数据临时目录:

mkdir /opt/module/HA/tmp
1
创建JournalNode日志目录:

mkdir /opt/module/HA/logs
1
创建Zookeeper数据目录:

mkdir /opt/module/HA/zookeeper/zkData
1
5.4 分发HA目录
分发HA目录下的所有内容到hadoop103,hadoop104,hadoop105上。

xsync /opt/module/HA/
1
六、启动HA集群🎈
6.1 Zookeeper启动测试
分别在hadoop103,hadoop104,hadoop105三个节点上启动Zookeeper,因为这三个节点在集群规划中有ZK。

zkServer.sh start

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/219eb1c17e60b70b9f7ef9a24ee68324..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/fb877d0b09b589a9def967a5a24fd1d7..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/123413f60faaa37b0021046b9fae7d9f..png


三个节点上的Zookeeper均启动成功!

6.2 启动JournalNode
分别在hadoop102,hadoop103,hadoop104三个节点上启动Zookeeper,因为这三个节点在集群规划中有JNN。

并且,JournalNode只需要手动启动一次,以后启动Hadoop HA高可用集群均不需要再次手动启动。

hdfs --daemon start journalnode
1
现在,我们通过jps来查看进程,ZK和JNN是否按照集群规划启动好了?


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/5c2ea3a66099c1b4e986c09857138fd9..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/ce2ceacd1c88a434b071e3ff568fed0c..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/2e0fdf329a4d2789c408f4c0e41ca982..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/1cbb4ea9f707eb623f21023b68ca447f..png



可以看到,目前集群规划正确,下面我们就可以进行下一步操作啦。

6.3 初始化NameNode
在是NameNode节点上的任意一个节点上初始化NameNode,并且只需要初始化一遍,这里我的集群中,hadoop102和hadoop103上都有NameNode,但是因为hadoop103上有DataNode,所以我 选择使用hadoop102作为初始化节点 。

hdfs namenode -format
1


6.4 初始化Zookeeper
在具有Zookeeper节点上的任意一个节点上初始化Zookeeper,并且只需要初始化一遍。这里我选择在hadoop103上进行初始化。

hdfs zkfc -formatZK
1


判断是否初始化成功:(在三台都查看一下)

zkCli.sh
1
ls \
1


6.5 启动集群
分别在hadoop102,hadoop103上启动NameNode。

hadoop102上执行:(只需执行一次)

hdfs --daemon start namenode
1
hadoop103上执行:(只需执行一次)

hdfs namenode -bootstrapStandby
1


在hadoop102上启动集群:

start-dfs.sh
1


至此,集群中的NameNode,DataNode,Zookeeper,ZKFC,JournalNode都已经启动好了。下面,让我们一起来看看,我们的集群能否经得住检验吧!

七、检验集群✨
7.1 jps检查
使用jpsall脚本分别查看四个节点上的jps进程信息,是否和集群规划相符,集群规划图再放一遍:

jpsall
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/5387edd7754b818c25af66f80645311c..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/3c5415b79a7d65462943e0483b08461b..png



和集群规划完全一致!

7.2 网页检查
分别访问NameNode1和NameNode2的两个Web页面,网址是http://hadoop102:9870,http://hadoop103:9870,结果如下:
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/6ce181efdef871578421bec255adc8a8..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/f93917ccaff3792821139f7f9c681ee1..png


网站访问中hadoop102的NameNode是active状态,hadoop103中的NameNode是standby状态。

7.3 自动故障转移检查
使用如下命令kill掉hadoop102上的NameNode进程:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/cb51bc7ecbd2172771a9342363bddc7e..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/17858b0bc608b311104e52f133c0e74f..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/21bbcd4e38371887a8832725eaa2bfee..png

这里,我们遇到了将NameNode-1的进程kill掉之后,另外一个NameNode没有变成active状态的问题,也就是说并没有实现自动故障转转移!

让我们一起来解决吧!

7.4 解决NameNode无法自动故障转移问题
这里引入一个 “脑裂” 的概念。

active namenode工作不正常后,zkfc在zookeeper中写入一些数据,表明异常,这时standby namenode中的zkfc读到异常信息,并将standby节点置为active。

但是,如果之前的active namenode并没有真的死掉,出现了假死(死了一会儿后又正常了),这样,就有两台namenode同时工作了。这种现象称为 脑裂 。

这里提供两种解决方案:

法一:改变kill方式——安装psmisc插件
上述中,我们使用kill掉NameNode进程的方法是:

kill -9 进程号
1
但是这种方式不一定能够完全 kill 掉NameNode的状态,可能就会出现残余从而出现“脑裂”现象,所以我们采用 psmisc插件 的方式来彻底结束进程。

更加神奇的是,这个插件安装好了,并不需要我们手动使用,而是系统自己调用的!



在hadoop102、hadoop103上按照psmisc插件:

sudo yum install -y psmisc
1
感受psmisc插件的威力
这里,我们先手动将hadoop102的NameNode启动起来,它目前是standby状态:

hdfs --daemon start namenode
1



Kill掉Hadoop103的NameNode进程:





成功完成了NameNode的自动故障转移!

原理 :在备机准备上位的时候,它不管现在的主节点是不是真的挂机了,他都会使用远程登录技术ssh登录到主机上, 使用 killall namenode (这个killall就是psmisc插件的命令) 杀死它的namenode进程确保它真的结束了,有效的防止了出现“脑裂”的问题。

法二:修改hdfs-site.xml文件
ZFKC的机制中,HealthMonitor定期去检查namenode的健康状态,如果我们杀掉namenode的服务,该namenode及其端口都关闭了。

推测因为无法正常通信所以保守确定namenode是否真的失效的等等时间大大延长。

那么如何解决这个问题呢?

就是在hdfs-site.xml文件配置隔离机制的地方加上一行shell(/bin/true),改为:

<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
1
2
3
4
5
6
7
这里不再演示效果,大家可以自行尝试哦!

八、日后HA启动方式🐮
之后即可使用 myHA 脚本进行启停了!


  • 免责申明:

    本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

  • 《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu


  • 《数栈V6.0产品白皮书》下载地址:https://fs80.cn/cw0iw1

  • 想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs

    同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
    https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群