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
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
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
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,说明搭建成功
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
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
# 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集群