完美搭建Hadoop HA高可用集群(亲测五台有效)
Hadoop HA高可用集群一、虚拟机基础配置1、配置五台机器的防火墙、network、hostname、hosts以及免密登录1.1修改hostname1.2关闭防火墙1.3配置network1.4编辑hosts主机名映射1.5设置.ssh免密登录2、时间同步3、`以上五步每台机器都要操作一遍`4、编写shell脚本4.1在`/root/bin`目录下创建xcall脚本文件4.2在`/root/
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
更多推荐
所有评论(0)