一、前言
- 所谓HadoopHA高可用集群就是要消灭单点故障问题,实现7 * 24小时无间断提供服务。
- 当然想到搭建高可用前提示会搭建hadoop的分布式,最起码也要熟练搭建伪分布式。
- 想要实现自动故障转移,需要借助Zookeeper来实现管理和检查节点的健康状态。也就是需要会搭建Zookeeper集群,本次搭建我就不在演示搭建zookeeper集群了,如果还不熟悉参考我之前的博客。
https://blog.youkuaiyun.com/qq_44719527/article/details/104671380
- 如果伪分布式还不熟悉参考(包括修改主机名,修改hosts文件,解压)
https://blog.youkuaiyun.com/qq_44719527/article/details/104560392
- 需要免密登录,详见
https://blog.youkuaiyun.com/qq_44719527/article/details/104670797
二、搭建环境版本和环境说明
1.使用linuxCentOS6.10(三台)
2.hadoop2.7.2,jdk1.8.0_144
3.zookeeper3.0.4
4.Xshell5
三、搭建步骤
1.首先当然是上传压缩包,解压就不演示了。。。
2.关闭防火墙,修改静态ip,更改主机名,三台都需要修改。然后重启
3.更改/ect/hosts文件,三台都需要同样的配置
节点有几台就配几台的IP和主机名映射
192.168.25.134 hadoop102
192.168.25.135 hadoop103
192.168.25.136 hadoop104
4.保证zookeeper集群是启动没问题的,地址https://blog.youkuaiyun.com/qq_44719527/article/details/104671380
5.配置高可用的HDFS
(1)去修改core-site.xml
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/ha/hadoop-2.7.2/data/tmp</value>
</property>
<!--zookeeper配置-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
(2)修改hdfs-site.xml,这里注意使用隔离机制时需要ssh无秘钥登录
,我这里是root用户,你是什么用户,就写你的用户名。注意修改主机名与你自己的对应了。
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop102:9000</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop103:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop102:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop103:50070</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/ha/hadoop-2.7.2/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--自动故障转移开启-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
(3)修改hadoop.env.xml,填写jdk的路径
(4)修改yarn.site.xml,注意修改主机名与你自己的对应了。
<!-- reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--启用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--声明两台resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop102</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop103</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</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>
(5)修改yarn.env.xml,添加jdk的路径,
(6)打开slaves添加节点主机名,不需要ip,注意修改主机名与你自己的对应了。
(7)复制mapred.site.xml.template 文件名是mapred.site.xml
,注意修改主机名与你自己的对应了。
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
(8)打开mapred.env.xml添加jdk路径
(9)分发给其他节点,这里就需要时候ssh免密登录了,如果不设置免密,需要一直输入密码。还有启动的时候,会麻烦死。
1)可以使用分发,这个是适合我的脚本,对脚本不熟悉的可以使用scp
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=102; host<105; host++)); do
#echo $pdir/$fname $user@hadoop$host:$pdir
echo --------------- hadoop$host ----------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
2)分发完去其他节点查看一下有没有,是否分发成功
四、启动
1.先启动journalnode
,三台都需要启动
sbin/hadoop-daemon.sh start journalnode
2.在[nn1]上,对其进行格式化,并启动
(1)格式化命令,只是第一次需要,以后启动不再需要格式化。
bin/hdfs namenode -format
(2)启动namenode
sbin/hadoop-daemon.sh start namenode
3.在[nn2]上,同步nn1的元数据信息
bin/hdfs namenode -bootstrapStandby
4.如果两个namenode都能手动起来说明配置八成没有问题,现在把两个
namenode都关闭
sbin/hadoop-daemon.sh stop namenode
5.初始化HA在Zookeeper中状态
bin/hdfs zkfc -formatZK
6.启动hdfs服务
sbin/start-dfs.sh
7.启动yarn进程,这个脚本只能启动一个resourcemanager
sbin/start-yarn.sh
8.发现只有一个resourcemanager,我们需要手动开启nn2
节点上的resourcemanager
sbin/yarn-daemons.sh start resourcemanager
五、遇到的问题和注意事项
1.格式化只需要第一次启动的时候格式化,以后启动不需要了
2.zookeeper集群一定保证正常开启且是第一个开启的。
3.注意ip和主机名的映射不要写错,最好是配置静态ip
4.如果多次格式化了 ,需要删掉 临时目录和日志文件在格式化。如果不删,namenode八成起不来
5.防火墙一定要关闭或开放端口。
6.其他问题私信博主
写作不易,如果对您有所帮助,请给一个小小的赞,您的点赞是对我莫大的支持和鼓励,谢谢!!!