Hadoop 2.7.3 高可用(HA)集群部署
本文主要介绍如何搭建HDFS(NameNode)和ResourceManager高可用的Hadoop集群。
HDFS的高可用(HA)的实现方式:
一种是将NN维护的元数据保存一份到NFS上,当NN故障,可以通过另一台NNe读取NFS目录中的元数据备份进行恢复工作,需要手动进行操作,并不是真正意义上的HA方案。
另一种是准备一台备用NN节点,通过定期下载NN的元数据和日志文件来备份,当NN故障时,可以通过这台进行恢复,由于主备节点元数据和日志并不是实时同步,所以会丢失一些数据。
前两种方案都不是很理想,社区提供一种更好的方案,基于QJM(Qurom Journal Manager)的共享日志方案。QJM的基本原理是NN(Active)把日志写本地和2N+1(奇数)台JournalNode上,当数据操作返回成功时才写入日志,这个日志叫做editlog,而元数据存在fsimage文件中,NN(Standby)定期从JournalNode上读取editlog到本地。在这手动切换的基础上又开发了基于Zookeeper的ZKFC(ZookeeperFailover Controller)自动切换机制,Active和Standby节点各有ZKFC进程监控NN监控状况,定期发送心跳,当Active节点故障时Standby会自动切换为ActiveNode,本次就用的此方案。如下图所示:
ResourceManager(RM) HA实现方式:
RM将状态信息存储在Zookeeper中,当Active故障,Standby切换为Active后,从ZK读取相应的作业信息,重新构建作业的内存信息,然后开始接受NodeManager心跳,并接受客户端提交作业的请求等。
一、部署前的准备工作
- OpenStack 平台,构建虚拟机,也可用VMWare代替
- Centos7 x64 操作系统
- Hadoop 2.7.3 64位安装包(bin版)
- Zookeeper 3.4.9 安装包(bin版)
Apache 镜像下载地址:http://www.apache.org/dist/
Hadoop官方文档:Hadoop Document
二、集群规划
主机名 | IP | 安装的软件 | 运行的进程 |
---|---|---|---|
master1 | 172.16.1.33 | hadoop | NameNode(active)、DFSZKFailoverController、ResourceManager(active) |
master2 | 172.16.1.35 | hadoop | NameNode(Standby)、DFSZKFailoverController、ResourceManager(Standby) |
slaver1 | 172.16.1.22 | hadoop、zookeeper | DataNode、NodeManager、QuorumPeerMain、JournalNode |
slaver2 | 172.16.1.23 | hadoop、zookeeper | DataNode、NodeManager、QuorumPeerMain、JournalNode |
slaver3 | 172.16.1.24 | hadoop、zookeeper | DataNode、NodeManager、QuorumPeerMain、JournalNode |
Note:
- 如果节点资源足够多,也可以吧ResourceManager单独安装在两个节点上,这样更符合HA的特性
- 除了必须有两个NameNode之外,DataNode的节点可以尽可能的多,配置方式一样
三、基础环境配置
§ 更改主机名,并建立主机名与IP的映射关系(每个节点都要做)
1、临时更改主机名,机器重启后失效,以master1
为例,其余每个节点同样设置:
# hostname master1
# hostname
master1
2、永久修改主机名
修改centos网络配置文件/etc/sysconfig/network
,在末尾添加HOSTNAME=master1
:
# vim /etc/sysconfig/network
NETWORKING=yes
NOZEROCONF=yes
HOSTNAME=master1
~
~
3、修改/etc/hosts
文件,最终状态,节点中的每台主机都要修改好相应的主机名,并在hosts
文件中写入相应的IP 和主机名的映射关系,状态如下所示:
# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.33 master1
172.16.1.35 master2
172.16.1.22 slaver1
172.16.1.23 slaver2
172.16.1.24 slaver3
~
~
这样是永久修改,重启后生效,也可以结合第一种方法,让该用户名立即生效。
NOTE:
- 在/etc/
下有一个hostname
文件,如果是Ubuntu系统可以直接在这个文件下面写入想要设置的主机名来达到永久修改主机名。
- 经过验证,openstack生成的虚拟机中,hostname
会写有一个类似于test.novalocal
的以*.novalocal
结尾的主机名,如果按照方法2修改主机名,每次重启后,会自动把主机名设成这个名字,而不能如愿更改为我们想要的主机名,即使在hostname
文件中,删掉原有主机名,写上我们想要设置的主机名,重启后以后会还原为删掉之前的样子。
- 所以,在本次配置中,我们使用方法1来临时修改主机名,尽量不重启机器,如果需要重启机器,重启后重新修改主机名,以防Hadoop不能正常启动。
§ 关闭防火墙(每个节点都要配置)
如果是生产环境中可以通过配置iptables规则来开放端口,此处我们作为实验且私网环境直接关闭放火墙来达到目的:
// 关闭防火墙
# sudo systemctl stop firewalld.service
// 关闭开机启动
# sudo systemctl disable firewalld.service
§ 创建专门的用户(每个节点都要配置)
在安装完Centos7后,如果在真实的生产环境中,最好建立一个新的用户和组,专门用来安装Hadoop。
1、在root下,创建组和用户,为每一台虚拟机创建一个Hadoop用户
// 先创建组cloud
# groupadd cloud
// 创建用户并加入组cloud
useradd -g cloud hadoop
// 修改用户hadoop的密码
# passwd hadoop
2、将hadoop用户加到soduers列表,获取root权限
// 查看/etc/sudoers的权限
# ls -l /etc/sudoers
// 修改权限为 777
# chmod 777 /etc/sudoers
// 将hadoop添加root权限
# vim /etc/sudoers
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL
// 还原权限
# chmod 440 /etc/sudoers
其他节点的机器同样操作。
NOTE:
- 本次部署,我们直接用的root用户,而没有新建hadoop用户和cloud组
- 相比于一台一台的修改配置文件,可以先在一台上面修改,然后用scp
命令分发到其余各个节点的相应位置
§ 配置ssh免密登录(每个节点都要配置)
hadoop在使用过程中需要分发好多文件,配置好免密登录可以免去我们要不断地输入密码的麻烦。也有助于我们部署过程中把自己修改的配置文件分发到各个节点。
1、生成公钥和私钥,过程中会有一些提示选项,直接按回车,采用默认值便好
# ssh-keygen -t rsa
2、执行完上面的命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥),将公钥拷贝到要免登陆的机器上:
# ssh-copy-id 172.16.1.33
# ssh-copy-id 172.16.1.35
# ssh-copy-id 172.16.1.22
# ssh-copy-id 172.16.1.23
# ssh-copy-id 172.16.1.24
3、这时会在相应的主机的~/.ssh/
下产生一个名为authorized_keys
的文件,这时通过 ssh 172.16.1.35
(修改为相应的主机对应的IP) 时可以直接免密登陆进入主机。
4、其他的每一个节点同样操作。
NOTE:
- 也可以选择先在每一个节点上生成相应的私钥和公钥,然后把公钥通过用scp
命令发送到一台机器上,比如master1
,然后统一一块加入到这台机器~/.ssh/authorized_keys
文件里面
- 然后把这个文件用scp
分发到每一台机器的~/.ssh/
文件夹中
- 这样就实现了集群中每一个节点的相互免密登录,而且,省去了每个节点都要手动配置的麻烦
四、安装JDK(每个节点都要配置)
本次是用的是 jdk-8u101-linux-x64.tar.gz ,可以从Oracle官网下载,然后传送到每一台机器上,并解压,解压的路径可以自由选择,本次选择/opt/
。
# tar -zxvf jdk-8u101-linux-x64.tar.gz -C /opt
// 修改文件夹名字
# # mv /opt/jdk1.8.0_101 /opt/jdk8
配置环境变量:
// 修改配置文件
# sudo vim /etc/profile
// 在最后下添加
export JAVA_HOME=/opt/jdk8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib
// 刷新配置文件
# source /etc/profile
其他每台机器都做同样的配置,或者将这个配好的jdk和profile文件用scp
命令分发到每一台机器上。
NOTE:
- jdk的安装目录尽量不要选在普通用户的/home/USER_NAME
家目录下,因为在后面hadoop
配置中需要用到这个jdk的目录的绝对路径,如果写到/home/USER_NAME
这个里面,其中的/USER_NAME
会根据分发到各节点的用户名不同而不同,所以要在hadoop
中重新配置这个JAVA_HOME
的绝对路径,否则会导致启动失败。
五、安装zookeeper(所有的slaver节点都要安装)
在slaver1、slaver2、slaver3上安装zookeeper。
1、从Apache官网下载zookeeper-3.4.9.tar.gz,并上传到以上三台节点的任意一台上面,然后解压到/opt
:
# tar -zxvf zookeeper-3.4.8.tar.gz -C /opt
// 重命名文件夹
# mv zookeeper-3.4.8 zookeeper<