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

hadoop3.2.1高可用集群搭建

准备工作

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

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

主机名称namenodedatanodeJournalnodezookeeper
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修改为你的主机ip
   restrict 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.0
    fudge 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 stop
  0-59/10 * * * * /usr/sbin/ntpdate -u hadoop1
  0-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 myid
   1
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>
                sshfence
                shell(/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
 $ jps
  1540 NameNode
  1606 Jps
  1255 QuorumPeerMain
  1358 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集群
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值