完美搭建Hadoop HA高可用集群(亲测五台有效)

一、虚拟机基础配置

在这里插入图片描述

1、配置五台机器的防火墙、network、hostname、hosts以及免密登录

1.1 修改hostname

hostnamectl set-hostname master

在这里插入图片描述

1.2 关闭防火墙

systemctl stop firewalld	【关闭防火墙】
systemctl disable firwalld	【自动关闭防火墙】

在这里插入图片描述

1.3 配置network

vi /etc/sysconfig/network-scripits/ifcfg-ens33

在这里插入图片描述
在这里插入图片描述
  DNS1默认8.8.8.8、子网掩码、IP以及网关相关配置方法如下图
在这里插入图片描述
在这里插入图片描述

  编辑好后保存退出,然后重新启动network,检查是否能正常上网。

systemctl restart network
//测试上网功能
ping www.baidu.com

在这里插入图片描述

1.4 编辑hosts主机名映射

vi /etc/hosts

在这里插入图片描述
配置如下:

在这里插入图片描述

1.5 设置.ssh免密登录

输入以下命令然后一直按回车,即可生成本机密钥。

ssh-keygen -t rsa

在这里插入图片描述
将本机密钥拷贝到集群所有虚拟机中,这样就可以免密登录所有虚拟机。

[root@master ~]# ssh-copy-id master
[root@master ~]# ssh-copy-id master2
[root@master ~]# ssh-copy-id slave1
[root@master ~]# ssh-copy-id slave2
[root@master ~]# ssh-copy-id slave3

2、时间同步

首先用yum命令下载ntp

[root@master ~]# yum -y install ntp

执行同步命令:

root@master ~]# ntpdate time1.aliyun.com

查看当前系统时间:

root@master ~]# date

同步系统时间到硬件时钟(防止重启系统再次同步系统时间):

root@master ~]# hwclock -w

3、 以上五步每台机器都要操作一遍

4、编写shell脚本

4.1在/root/bin目录下创建xcall脚本文件

[root@master ~]# mkdir bin
[root@master ~]# cd bin/
[root@master bin]# touch xcall
[root@master bin]# chmod 777 xcall
[root@master bin]# vi xcall 

xcall脚本用来集群共同执行同一命令,脚本如下:

#!/bin/bash

for host in master master2 slave1 slave2 slave3
do
        echo ------------- $host  -------------
        ssh $host "$*"
done

4.2在/root/bin目录下创建xrsync脚本文件

首先使用刚才写好的xcall脚本给集群安装rsync

[root@master ~]# xcall yum -y install rsync
[root@master bin]# touch xrsync
[root@master bin]# chmod 777 xrsync
[root@master bin]# vi xrsync

xrsync脚本用来给集群分发/同步文件,脚本如下:

#!/bin/bash

# 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0));then
echo no args;
exit;
fi

# 获取文件名
p1=$1
fname=`basename $p1`
echo fname=$fname

# 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1);pwd`
echo pdir=$pdir

# 获取当前用户名字
user=`whoami`

# 将文件拷贝到目标机器
for host in master master2  slave1 slave2 slave3
do
        echo -----------$host --------------
        rsync -av $pdir/$fname $user@$host:$pdir
done

4.3在/root/bin目录下创建zk脚本文件

[root@master bin]# touch zk
[root@master bin]# chmod 777 zk
[root@master bin]# vi zk

zk脚本用启动停止zookeeper服务,脚本如下:

#!/bin/bash

case $1 in
"start"){
        for i in slave1 slave2 slave3
        do
                echo ------------ $i  -------------
                ssh $i "/opt/bigdata/zk345/bin/zkServer.sh start"
        done
};;
"restart"){
        for i in slave1 slave2 slave3
        do
                echo ------------ $i  -------------
                ssh $i "/opt/bigdata/zk345/bin/zkServer.sh restart"
        done
};;
"stop"){
        for i in slave1 slave2 slave3
        do
                echo ------------ $i  -------------
                ssh $i "/opt/bigdata/zk345/bin/zkServer.sh stop"
        done
};;
"status"){
        for i in slave1 slave2 slave3
        do
                echo ------------ $i  -------------
                ssh $i "/opt/bigdata/zk345/bin/zkServer.sh status"
        done
};;
esac

二、安装软件

  安装包链接: https://pan.baidu.com/s/1vt9iVA3mOEfXpUCuWPZ36Q 提取码: s6r3

  首先将安装包放到/opt/install目录下,该目录需要自行创建

1、安装jdk

1.1 首先创建文件夹

[root@master ~]# mkdir /opt/install
[root@master ~]# mkdir /opt/bigdata

1.2 使用xftp将安装包拖入install文件夹下
在这里插入图片描述
1.3 将这三个安装包都解压到/opt/bigdata文件夹下

[root@master install]# tar -xzf jdk-8u111-linux-x64.tar.gz -C ../bigdata/
[root@master install]# tar -zxf hadoop-2.6.0-cdh5.14.2.tar.gz -C ../bigdata/
[root@master install]# tar -zxf zookeeper-3.4.5-cdh5.14.2.tar.gz -C ../bigdata/

在这里插入图片描述
1.4 将三个文件改一下名字
在这里插入图片描述
1.5 创建env.sh文件用来配置环境变量

[root@master bigdata]# cd /etc/profile.d/
[root@master profile.d]# touch env.sh
[root@master profile.d]# vi env.sh 

在这里插入图片描述
1.6 配置java jdk环境变量

export JAVA_HOME=/opt/bigdata/jdk180
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

在这里插入图片描述
1.7 使环境变量立即生效

[root@master profile.d]# source /etc/profile.d/env.sh 

1.8 检查jdk是否安装成功

[root@master profile.d]# java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

1.9 分发jdk文件和环境变量

[root@master ~]# xrsync /opt/bigdata/jdk180/

[root@master ~]# xrsync /etc/profile.d/env.sh
//使每台机器上的环境变量生效
[root@master ~]# xcall source /etc/profile.d/env.sh 

//测试jdk安装成功
[root@master ~]# xcall jps
------------- master -------------
1732 Jps
------------- master2 -------------
1677 Jps
------------- slave1 -------------
1658 Jps
------------- slave2 -------------
1649 Jps
------------- slave3 -------------
1682 Jps

2、安装zookeeper

2.1 首先到zk345目录下创建zkData文件夹并在zkData目录下创建myid文件,后面在该文件中用来编辑安装zookeeper的虚拟机编号。

[root@master ~]# cd /opt/bigdata/zk345/
[root@master zk345]# mkdir zkData
[root@master zk345]# cd zkData/
[root@master zkData]# touch myid
[root@master zkData]# ll
total 0
-rw-r--r--. 1 root root 0 Jun  9 22:15 myid

在这里插入图片描述
2.2 到conf目录下,拷贝一份 zoo.cfg 文件

[root@master zkData]# cd ../../
[root@master bigdata]# cd zk345/conf/
[root@master conf]# cp zoo_sample.cfg zoo.cfg
[root@master conf]# vi zoo.cfg

在这里插入图片描述
2.3 配置zoo.cfg 文件

dataDir=/opt/bigdata/zk345/zkData

server.1=slave1:2287:3387
server.2=slave2:2287:3387
server.3=slave3:2287:3387

在这里插入图片描述

2.4 配置zookeeper环境变量

[root@master conf]# vi /etc/profile.d/env.sh
//配置如下:
export ZOOKEEPER_HOME=/opt/bigdata/zk345
export PATH=$PATH:$ZOOKEEPER_HOME/bin

在这里插入图片描述
2.5 分发zookeeper和环境变量

[root@master ~]# xrsync /opt/bigdata/zk345/

[root@master ~]# xrsync /etc/profile.d/env.sh 

[root@master ~]# xcall source /etc/profile.d/env.sh 

2.6 修改salve1~3三台机器的myid

[root@master ~]# ssh slave1
Last login: Tue Jun  9 20:57:10 2020 from 192.168.29.1
[root@slave1 ~]# vi /opt/bigdata/zk345/zkData/myid 
//在slave1的myid中只编辑一个数字1保存退出即可
[root@master ~]# ssh slave2
Last login: Tue Jun  9 20:57:11 2020 from 192.168.29.1
[root@slave2 ~]# vi /opt/bigdata/zk345/zkData/myid 
//在slave1的myid中只编辑一个数字2保存退出即可
[root@master ~]# ssh slave3
Last login: Tue Jun  9 20:57:33 2020 from 192.168.29.1
[root@slave3 ~]# vi /opt/bigdata/zk345/zkData/myid 
//在slave1的myid中只编辑一个数字3保存退出即可

2.7 检查zookeeper是否配置成功
  如下即zookeeper配置成功。

[root@master ~]# zk start
------------ slave1 -------------
JMX enabled by default
Using config: /opt/bigdata/zk345/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
------------ slave2 -------------
JMX enabled by default
Using config: /opt/bigdata/zk345/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
------------ slave3 -------------
JMX enabled by default
Using config: /opt/bigdata/zk345/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@master ~]# xcall jps
------------- master -------------
1852 Jps
------------- master2 -------------
1726 Jps
------------- slave1 -------------
1748 QuorumPeerMain
1783 Jps
------------- slave2 -------------
1776 Jps
1735 QuorumPeerMain
------------- slave3 -------------
1765 QuorumPeerMain
1800 Jps
[root@master ~]# 

3、安装Hadoop

3.1 启动服务配置
在这里插入图片描述

3.2 配置hadoop-env.sh文件

[root@master ~]# cd /opt/bigdata/hadoop260/etc/hadoop
[root@master hadoop]# vi hadoop-env.sh

配置如下:

export JAVA_HOME=/opt/bigdata/jdk180

在这里插入图片描述

3.3 配置mapred-env.sh文件

[root@master hadoop]# vi mapred-env.sh

配置如下:

export JAVA_HOME=/opt/bigdata/jdk180

在这里插入图片描述
3.4 配置yarn-env.sh文件

[root@master hadoop]# vi yarn-env.sh

配置如下:

export JAVA_HOME=/opt/bigdata/jdk180

在这里插入图片描述

3.5 配置slaves文件(该文件下用来配置要启动NameNode的机器的localhost)

[root@master hadoop]# vi slaves

配置如下:

slave1
slave2
slave3

在这里插入图片描述
3.6 配置core-site.xml文件

[root@master hadoop]# vi core-site.xml 

配置如下:

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://cluster1</value>
        </property>
        <!-- hadoop运行时存储路径 -->
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/opt/bigdata/hadoop260/hadoopdata</value>
        </property>
        <property>
                <name>hadoop.proxyuser.root.hosts</name>
                <value>*</value>
        </property>
        <property>
                <name>hadoop.proxyuser.root.groups</name>
                <value>*</value>
        </property>
        <!-- 配置Zookeeper 管理HDFS -->
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>slave1:2181,slave2:2181,slave3:2181</value>
        </property>
</configuration

在这里插入图片描述

3.7 配置hdfs-site.xml文件

[root@master hadoop]# vi hdfs-site.xml 

配置如下:

<configuration>
        <!-- 副本数(正常为3-->
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>

        <!-- 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口 -->
        <property>
                <name>dfs.nameservices</name>
                <value>cluster1</value>
        </property>

        <!-- 设置集群中两台NameNode的名称为nn1和nn2 -->
        <property>
                <name>dfs.ha.namenodes.cluster1</name>
                <value>nn1,nn2</value>
        </property>

        <!-- nn1 rpc地址 -->
        <property>
                <name>dfs.namenode.rpc-address.cluster1.nn1</name>
                <value>master:9000</value>
        </property>

        <!-- nn2 rpc地址 -->
        <property>
                <name>dfs.namenode.rpc-address.cluster1.nn2</name>
                <value>master2:9000</value>
        </property>
                
        <!-- nn1 http地址 -->
        <property>
        </property>

        <!-- nn2 http地址 -->
        <property>
                <name>dfs.namenode.http-address.cluster1.nn2</name>
                <value>master2:50070</value>
        </property>

        <!-- 启动故障自动恢复 -->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>

        <!-- journal配置 指定NameNode的edits元数据在JournalNode上的存放位置一般跟zookeeper部署在一起 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://slave1:8485;slave2:8485;slave3:8485/cluster1</value>
        </property>

        <!-- 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 -->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/opt/bigdata/hadoop260/journaldata/jn</value>
        </property>

        <!-- namenode高可用主备切换配置  -->

        <!-- 开启NameNode失败自动切换 -->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>

        <!-- 配置失败自动切换实现方式,使用内置的zkfc 客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点
是否活跃-->
        <property>
                <name>dfs.client.failover.proxy.provider.cluster1</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>

        <!-- 配置隔离机制 -->
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>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>

        <!-- 关闭权限检查-->
        <property>
                <name>dfs.permissions.enable</name>
                <value>false</value>
        </property>
</configuration>

在hadoop260目录下创建JournalNode集群数据存放目录:

[root@master hadoop260]# mkdir -p journaldata/jn

3.8 配置mapred-site.xml文件

[root@master hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@master hadoop]# vi mapred-site.xml

配置如下:

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>master:10020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>master:19888</value>
        </property>
</configuration>

在这里插入图片描述
3.9 配置yarn-site.xml文件

[root@master hadoop]# vi yarn-site.xml

配置如下:

<configuration>

<!-- Site specific YARN configuration properties -->
        <!-- reducer获取数据方式 -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
                <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>

        <!-- 日志聚集功能使用 -->
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>

        <!-- 日志保留时间设置7-->
        <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>604800</value>
        </property>

        <!-- 日志聚合HDFS目录 -->
        <property>
                <name>yarn.nodemanager.remote-app-log-dir</name>
                <value>/data/hadoop/yarn-logs</value>
        </property>

        <!-- 超时的周期 -->
        <property>
                <name>yarn.resourcemanager.connect.retry-interval.ms</name>
                <value>2000</value>
        </property>

        <!-- 打开高可用 -->
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property>

        <!-- 给yarn cluster 取个名字yarn-rm-cluster -->
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>yarn-rm-cluster</value>
        </property>

        <!-- 给ResourceManager 取个名字 rm1,rm2 -->
        <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
        </property>

        <!-- 配置ResourceManager rm1 hostname -->
        <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>master</value>
        </property>

        <!-- 配置ResourceManager rm2 hostname -->
        <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>master2</value>
        </property>

        <!-- 启用resourcemanager 自动恢复 -->
        <property>
                <name>yarn.resourcemanager.recovery.enabled</name>
                <value>true</value>
        </property>

        <!-- 配置Zookeeper地址 -->
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>slave1:2181,slave2:2181,slave3:2181</value>
        </property>

        <!--指定resourcemanager的状态信息存储在zookeeper集群,默认是存放在FileSystem里面 -->
        <property>
                <name>yarn.resourcemanager.store.class</name>
                <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
</configuration>

3.10 配置hadoop环境变量文件

[root@master hadoop]# vi /etc/profile.d/env.sh

配置如下:

export HADOOP_HOME=/opt/bigdata/hadoop260
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

在这里插入图片描述

3.11 分发Hadoop和环境变量文件

[root@master ~]# xrsync /opt/bigdata/hadoop260/

[root@master ~]# xrsync /etc/profile.d/env.sh

[root@master ~]# xcall source /etc/profile.d/env.sh

配置没有问题
在这里插入图片描述

3.12 启动hadoop ha 高可用集群一定要按着以下顺序步骤启动集群!!
①首先使用shell脚本启动zookeeper

[root@master ~]# zk start

在这里插入图片描述
②然后启动配置了DataNode的机器上的JournalNode

[root@slave1 ~]# source /etc/profile.d/env.sh
[root@slave1 ~]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /opt/bigdata/hadoop260/logs/hadoop-root-journalnode-slave1.out
[root@slave2 ~]# source /etc/profile.d/env.sh
[root@slave2 ~]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /opt/bigdata/hadoop260/logs/hadoop-root-journalnode-slave1.out
[root@slave3 ~]# source /etc/profile.d/env.sh
[root@slave3 ~]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /opt/bigdata/hadoop260/logs/hadoop-root-journalnode-slave1.out

③查看journalnode集群
在这里插入图片描述
④重置第一台master机器的hdfs

[root@master ~]# hdfs namenode -format

在这里插入图片描述
⑤启动master上的NameNode

[root@master ~]# hadoop-daemon.sh start namenode

启动成功
在这里插入图片描述
⑥在第二台master2机器上同步第一台master上的NameNode节点信息

[root@master2 ~]# source /etc/profile.d/env.sh 
[root@master2 ~]# hdfs namenode -bootstrapStandby

在这里插入图片描述
⑦在master机器上重置ZK

[root@master ~]# hdfs zkfc -formatZK

在这里插入图片描述
⑧先关掉dfs.sh,然后重新启动

[root@master ~]# stop-dfs.sh 

[root@master ~]# start-dfs.sh 

在这里插入图片描述
查看启动情况,dfs启动成功
在这里插入图片描述
⑨在配置了ResourceManager的其中一台机器上启动yarn

[root@master ~]# start-yarn.sh

在这里插入图片描述
查看ResourceManager和NodeManager是否启动成功
在这里插入图片描述
  我们可以看到master2上ResourceManager没有启动,因为这个需要我们自己手动启动。

启动master2上的ResourceManager

[root@master2 ~]# yarn-daemon.sh start resourcemanager

在这里插入图片描述

3.13 测试hadoop ha 高可用集群
首先打开网页

http://192.168.29.161:50070
http://192.168.29.162:50070/

我们可以观察到master是active的,master2是standby的。
在这里插入图片描述
在这里插入图片描述
输入测试命令,切换两个NameNode的active

[root@master ~]# hdfs haadmin -failover nn1 nn2

在这里插入图片描述
刷新网页,我们可以看到master变成了standby的,master2变成了active。
在这里插入图片描述
在这里插入图片描述
我们再次输入测试命令,切换两个NameNode的active

[root@master ~]# hdfs haadmin -failover nn2 nn1

这时我们可以观察到master又切换回了active,master2又切换成了standby,所以NameNode高可用实现。

接下来测试ResourceManager是否高可用,首先打开网页

http://192.168.29.161:8088/
http://192.168.29.162:8088/

我们会发现我们只能打开一个网页,如下:

在这里插入图片描述
我们能看到master的ResourceManager是active的。接下来我们kill掉master的ResourceManager,重新打开网页看看结果。

在这里插入图片描述
在这里插入图片描述
这时我们可以看到,master2上的ResourceManager变成了active,所以ResourceManager也高可用。到此,Hadoop ha高可用机器搭建结束。

写作不易,如果对您有帮助希望您能给点个赞关注一下。谢谢!
转发麻烦注明出处:https://blog.csdn.net/weixin_43069500/article/details/106629675
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值