当前位置: 代码迷 >> 综合 >> hadoop3.2.1高可用集群搭建(一看就会,不会你打我)
  详细解决方案

hadoop3.2.1高可用集群搭建(一看就会,不会你打我)

热度:26   发布时间:2024-03-08 22:23:06.0

hadoop3.2.1高可用集群搭建

准备工作

# 确保所有安装hadoop的服务器之间能够ping通,安装好jdk1.8环境,以及各个服务器之间的免密登录
# ssh的免密登录可以参考hadoop3.2.1单节点集群的搭建,这里不再多做赘述

本次高可用集群搭建采用了三台服务器,关系如下表

主机名称 namenode datanode Journalnode zookeeper
hadoop1
hadoop2
hadoop3
# 以上只是三台服务器的搭建,也可以扩充服务器
# 主机名的修改以及ip映射关系的添加均在hadoop3.2.1单节点集群搭建中有说明,因此,直接进行高可用集群的搭建

一: 关闭和禁用防火墙

#关闭防火墙
$ systemctl stop firewalld
#禁止开机启用防火墙
$ systemctl disable firewalld

二: 准备集群的时间同步

2.1 检查是否有安装时间同步的插件

# 检查是否存在插件
$ rpm -qa | grep ntp
# 如果没有,则安装插件
$ yum -y install ntp ntpdate
# 选择一台服务器作为集群的时间服务器,比如hadoop1为时间服务器,hadoop2,hadoop3时间同步hadoop1

2.2 查看linux中的ntpd时间服务器

# 这里只要开启第一台机器的ntpd服务,其他的不用开
$ service ntpd status
$ service ntpd start# 开机启动设置
$ chkconfig ntpd on

2.3 修改时间服务器的配置文件

$ vi /etc/ntp.conf
#【第一处】修改为本集群的网段,注意将前面的#去掉,生效# Hosts on local network are less restricted.# 将这个ip修改为你的主机iprestrict 192.168.93.0 mask 255.255.255.0 nomodify notrap
#【第二处】由于是内网环境不用添加服务,前面加上注释#server 0.centos.pool.ntp.org#server 1.centos.pool.ntp.org#server 2.centos.pool.ntp.org
# 【第三处】开启本地服务(没有就手动添加),注意将前面的#去掉,生效server 127.127.1.0fudge 127.127.1.0 stratum 10
#保存文件,重启ntpd服务$ service ntpd restart

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yXQuwhCz-1603794466399)(/image-20200903171143176.png)]

2.4 更新本地时间

$ ntpdate -u 202.120.2.101
#可用于同步时间的网站
#us.pool.ntp.org
#cn.pool.ntp.org
#ntp.sjtu.edu.cn 202.120.2.101 (上海交通大学网络中心NTP服务器地址)
#s1a.time.edu.cn 北京邮电大学
#s1b.time.edu.cn 清华大学

2.5 查看本地硬件时钟时间,并进行更新

$ hwclock --localtime
# 系统时间同步给硬件时间
$ hwclock --localtime -w 或者  hwclock --systohc#设置服务器启动以后自动将硬件时钟时间同步给系统时间
$ vi /etc/sysconfig/ntpd
#添加: 
SYNC_HWCLOCK=yes#设置让系统时间自动同步给本地硬件时钟时间
$ vi /etc/sysconfig/ntpdate
# 添加或设置
$ SYNC_HWCLOCK=yes

2.6 其他服务器与这台服务器进行时间同步

# 剩余的所有机器
crontab -e
# 每10分钟同步一次时间0-59/10 * * * * /sbin/service ntpd stop0-59/10 * * * * /usr/sbin/ntpdate -u hadoop10-59/10 * * * * /sbin/service ntpd start

三:安装Zookeeper

3.1 进入主机hadoop1,将zookeeper解压到/opt/modules 目录下

# 1.解压
$ tar -zxvf /opt/softwares/zookeeper-3.4.14.tar.gz -C /opt/modules
# 2.修改zookeeper的配置文件
$ cd /opt/modules/zookeeper-3.4.14/conf/
$ cp zoo_sample.cfg zoo.cfg
$ vim zoo.cfg
# 修改:并在末尾加入
dataDir=/opt/datas/zookeeper/zkData
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVbppn2p-1603794466401)(/image-20200904095228287.png)]

3.2 创建myid文件

#在dataDir=/opt/datas/zookeeper/zkData目录下(这个目录根据服务器具体配置自定义),新建myid文件(文件名必须是这个),然后输入1
# 这里的1与server.1是一一对应的
$ cd /opt/datas/zookeeper/zkData/
$ vi myid1

3.3 将zookeeper分发到hadoop2,hadoop3,分别修改其myid文件值为2,3

# 如果服务器端口号不是默认的端口号,使用-P 来指定端口号
# 拷贝zookeeper
$ scp -P 60022 -r /opt/modules/zookeeper-3.4.14 root@hadoop3:/opt/modules
$ scp -P 60022 -r /opt/modules/zookeeper-3.4.14 root@hadoop2:/opt/modules
# 拷贝myid并修改其值
$ scp -P 60022 -r /opt/datas/zookeeper/zkData/myid  root@hadoop2:/opt/datas/zookeeper/zkData
$ scp -P 60022 -r /opt/datas/zookeeper/zkData/myid  root@hadoop3:/opt/datas/zookeeper/zkData

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PtCProKH-1603794466402)(/image-20200904100957400.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xDjJO5MD-1603794466404)(/image-20200904101024644.png)]

3.4 启动3台zookeeper服务

$ cd /opt/modules/zookeeper-3.4.14
$ bin/zkServer.sh start  //启动zookeeper
$ bin/zkServer.sh status  //查看zookeeper的状态
$ bin/zkCli.sh  //zookeeper客户端连接

3.5 启动zookeeper集群,可以看到一台是leader,其他是follower,说明搭建成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cu9kDkSP-1603794466405)(/image-20200904102051833.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-idHclumU-1603794466406)(/image-20200904102216992.png)]

3.6 关于zookeeper搭建过程中的出现的问题

# 1.jdk环境问题,可以使用如下命令查看,解决(进入zookeeper的解压目录的bin目录下)
./zkServer.sh start-foreground
# 也有可能是端口号未开放的原因。开启2888 3888 2181 三个端口(如何开放,自行百度)

四: hadoop的配置

4.1 在hadoop1节点上,配置hadoop

# 将hadoop解压到/opt/modules/ha-hadoop目录下
$ tar -zxvf hadoop-3.2.1.tar.gz -C /opt/modules/ha-hadoop
# 删掉doc文件夹
$ cd /opt/modules/ha-hadoop/hadoop-3.2.1/share
$ rm -rf doc/

4.2 进入到hadoop解压目录的etc/hadoop目录下,修改以下文件

1.hadoop-env.sh

$ vim hadoop-env.sh
#添加如下内容
export JAVA_HOME=/usr/java/latest
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
# 如果是默认端口号,省略下面这行配置
export HADOOP_SSH_OPTS="-p 60022"
#:root是指你当前集群的用户,如果是root用户,就写root,如果是普通用户,就写对应的普通用户名即可

2.mapred-env.sh

$ vim mapred-env.sh
# 添加如下内容
export JAVA_HOME=/usr/java/latest

3.yarn-env.sh

$ vim yarn-env.sh 
# 添加内容
export JAVA_HOME=/usr/java/latest

4.core-site.xml

$ vim core-site.xml 
# 添加如下内容
<configuration><!-- 指定hdfs的nameservice --><property><name>fs.defaultFS</name><value>hdfs://mycluster</value></property><!-- 指定hadoop临时目录 --><property><name>hadoop.tmp.dir</name><value>/data/ha_hadoop</value></property><!-- 修改访问垃圾回收站用户名称,默认是dr.who,修改为当前用户 --><property><name>hadoop.http.staticuser.user</name><value>root</value></property><!-- 指定zookeeper地址 --><property><name>ha.zookeeper.quorum</name><value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value></property>
</configuration>

5.hdfs-site.xml

$ vim hdfs-site.xml
# 添加如下内容<configuration><property><name>dfs.replication</name><value>2</value></property><property><name>dfs.permissions.enabled</name><value>false</value></property><!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 --><property><name>dfs.nameservices</name><value>mycluster</value></property><!-- mycluster下面有两个NameNode,分别是nn1,nn2 --><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><!-- RPC通信地址 --><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop1:8020</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop2:8020</value></property><!-- http通信地址 --><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop1:9870</value></property><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop2:9870</value></property><!-- 指定NameNode的edits元数据在JournalNode上的存放位置 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop1:8485;hadoop2:8485/mycluster</value></property><!-- 指定JournalNode在本地磁盘存放数据的位置 --><property><name>dfs.journalnode.edits.dir</name><value>/opt/datas/hadoop/ha-hadoop/journaldata</value></property><!-- 开启NameNode失败自动切换 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><!-- 配置失败自动切换实现方式 --><property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--><property><name>dfs.ha.fencing.methods</name><value>sshfenceshell(/bin/true)</value></property><!-- 使用sshfence隔离机制时需要ssh免登陆 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_rsa</value></property><!-- 配置sshfence隔离机制超时时间 --><property><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property>
</configuration>

6.workers

$ vim workers
# 删除掉原来的localhost,添加从节点的主机名
hadoop2
hadoop3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9rPzCIBQ-1603794466407)(/image-20200904105443298.png)]

4.3 将修改后的hadoop分发到其他节点的相同目录下

$ scp -P 60022 -r /opt/modules/ha-hadoop/hadoop-3.2.1 root@hadoop2:/opt/modules/ha-hadoop
$ scp -P 60022 -r /opt/modules/ha-hadoop/hadoop-3.2.1 root@hadoop3:/opt/modules/ha-hadoop

4.4 启动集群(严格按照顺序)

# 1.启动zookeeper (出现一个leader,两个follower,启动成功)
$ bin/zkServer.sh start
$ bin/zkServer.sh status# 2. 启动启动journalnode(分别在hadoop1,hadoop2上执行)
$ cd /opt/modules/ha-hadoop/hadoop-3.2.1/
$ bin/hdfs --daemon start journalnode
# 使用jps查看一下进程,如果出现JournalNode则表示journalnode启动成功。# 3. 格式化namenode(只要格式化一台,另一台同步即可),现在格式化hadoop1节点
$ bin/hdfs namenode -format#如果在倒数4行左右的地方,出现这一句就表示成功INFO common.Storage: Storage directory /你的tmp.dir路径/dfs/name has been successfully formatted.
# 4.启动namenode$ bin/hdfs --daemon start namenode$ jps1540 NameNode1606 Jps1255 QuorumPeerMain1358 JournalNode# 5. 同步hadoop1元数据到hadoop2中(必须先启动hadoop1节点)
# 在hadoop2节点上执行
$ bin/hdfs namenode -bootstrapStandby
如果出现:INFO common.Storage: Storage directory /你的tmp.dir目录/dfs/name has been successfully formatted.说明同步成功# 6.格式化ZKFC(在hadoop1上执行一次即可)
$ $ bin/hdfs zkfc -formatZK
若在倒数第4行左右显示:INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/mycluster in ZK.则表示ZKFC格式化成功# 7.启动HDFS(在hadoop1上执行)$ sbin/start-dfs.sh

4.5 访问hadoop1:9870,hadoop2:9870

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nlzLEU4r-1603794466407)(/image-20200904112949090.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rSUjSNjB-1603794466408)(/image-20200904113009459.png)]

# hadoop1,处于standby状态,hadoop2处于active状态,如果杀死hadoop2的namenode进程,hadoop1会自动切换到active状态
# 如果杀死active状态的namenode节点以后,hadoop不能自动切换,在每台机器安装
yum -y install psmisc
# 安装完成以后,重启整个hadoop集群

ter in ZK.则表示ZKFC格式化成功

7.启动HDFS(在hadoop1上执行)

$ sbin/start-dfs.sh


#### 4.5 访问hadoop1:9870,hadoop2:9870[外链图片转存中...(img-nlzLEU4r-1603794466407)][外链图片转存中...(img-rSUjSNjB-1603794466408)]```yaml
# hadoop1,处于standby状态,hadoop2处于active状态,如果杀死hadoop2的namenode进程,hadoop1会自动切换到active状态
# 如果杀死active状态的namenode节点以后,hadoop不能自动切换,在每台机器安装
yum -y install psmisc
# 安装完成以后,重启整个hadoop集群
  相关解决方案