6. Zookeeper和 集群HA配置
1. Zookeeper介绍:
1.基本介绍:
Zookeeper: 为分布式应用提供分布式协作(协调)服务。使用类似文件系统的树形结构。目的是分布式服务不再需要由于协作冲突而另外实现协作服务。
Zookeeper's Hierarchical Namespace一般情况下Zookeeper集群的服务器数量是奇数个,2N+1, N代表允许宕机的个数,下面文章中介绍使用3台主机进行实验。
Zookeeper集群统一为其他分布式应用(也是集群,例如HDFS集群、Yarn集群等等)集群提供协作服务。
2. Zookeeper角色。
Zookeeper角色不是手工配置的,而是集群自动选举产生的:
(1)Leader:做决策(做什么决策跟Zookeeper实现的功能有关),更新系统状态
(2)Follower:接入客户端。接收客户端请求,并返回响应结果给客户端。
(3)Observer:
(4)Client:使用协作服务的分布式应用,例如HDFS集群。
Zookeeper Service3.Zookeeper的典型应用场景:
(1)统一命名服务(Name Service)
(2)配置管理(Configuration Management)
(3)集群管理(Group Membership)
(4)共享锁(Locks)/ 同步锁
2. Zookeeper集群环境搭建和启动:
如果有单独的集群规划,可以在单独的机器上安装Zookeeper集群,我使用的是实验虚拟机环境,就直接在hadoop-senior01、hadoop-senior02、hadoop-senior03安装,与Hadoop共存,没有问题。
1. 下载Zookeeper安装包:
使用版本:zookeeper-3.4.5.tar.gz
(1)java环境安装:
见前边文章。
(2)上传解压安装包:
$ tar -zxf zookeeper-3.4.5.tar.gz -C /opt/modules/
2. 配置Zookeeper:
(1)复制配置文件:
在Zookeeper的主目录的conf文件夹下,有一个实例的配置文件zoo_sample.cfg,我们复制一份出来:
$ cd /opt/modules/zookeeper-3.4.5/conf
$ cp -a zoo_sample.cfg zoo.cfg
$ vi zoo.cfg
$ mkdir data
下面通过编辑这个文件来完成Zookeeper的配置:
(2)配置数据存储目录:
按照开发规范,我们通常在zookeeper的安装目录下,新建一个目录data,将这个目录作为zookeeper的数据存储目录。
dataDir=/opt/modules/zookeeper-3.4.5/data
zoo.cfg重要参数介绍:
tickTime:zookeeper服务器与服务器之间,或者服务器与客户端之间维持心跳的时间间隔。单位:毫秒。
clientPort:客户端连接zookeeper服务器的端口。默认2181
dataDir:Zookeeper保存数据的目录。
(3)在zoo.cfg中添加服务器信息:
格式: server.A=B:C:D 。 在zoo.cfg中添加如下内容:
server.1=192.168.8.128:2888:3888
server.2=192.168.8.129:2888:3888
server.3=192.168.8.130:2888:3888
(4)在每台服务器的$ZOOKEEPER_HOME/data/目录创建myid文件。
在hadoop-senior01服务器(192.168.8.128)上,cd 到$ZOOKEEPER_HOME/data/目录,创建myid文件,myid文件的内容是1
在hadoop-senior02服务器(192.168.8.129)上,cd 到$ZOOKEEPER_HOME/data/目录,创建myid文件,myid文件的内容是2
在hadoop-senior03服务器(192.168.8.130)上,cd 到$ZOOKEEPER_HOME/data/目录,创建myid文件,myid文件的内容是3
注意:myid文件在linux下用vi创建。
在一台机器上配置好,拷贝到其他服务器:
$ scp -r zookeeper-3.4.5/ natty@hadoop-senior02.pmpa.com:/opt/modules/
3.启动Zookeeper:
(1)启动Zookeeper:
$ bin/zkServer.sh start
(2)查看状态
$ bin/zkServer.sh status
$ jps
注意:启动操作需要在三台服务器上都执行。
3. Zookeeper基本命令介绍
使用命令,可以使用bin/zkCli.sh脚本
$ bin/zkCli.sh
在zkCli.sh进入命令行模式后,可以敲命令操作。使用help命令来查看可以使用的所有的命令。
[zk: localhost:2181(CONNECTED) 0] ls /
[zk: localhost:2181(CONNECTED) 1] help
[zk: localhost:2181(CONNECTED) 2] create /test pmpa_test
查看刚才创建的/test的信息:
[zk: localhost:2181(CONNECTED) 4] get /test
4. Namenode HA 介绍:
为了防止Namenode的单点故障,Hadoop 2.x版本增加了HA(High Available 高可用)功能。在下边两种情况下,需要配置HA:Namenode机器发生意外;Namenode机器需要升级。 HDFS HA通过配置Active/Standby 两个Namenode实现在集群中对Namenode的热备。下面实现配置:使用Quorum Journal Manager(QJM) 在Active Namenode和Standby Namenode来共享edit logs。
HDFS HA设计另外,在hadoop 2.x版本之前,没有自带HA功能,如果要实现此功能,可以使用Linux上的keepalived软件进行热备。
HDFS HA设计1. HDFS HA using QJM 架构:
在典型的HA集群中,Active Namenode响应客户端的操作请求,而Standby Namenode作为一个slave执行,只是保持跟Active Namenode的状态一致。Active namenode和Standby namenode为了保持一致,他们都与JournalNodes(JNs)进行通信。每当Active node修改namespace时,都会将修改日志计入JNs中,Standby node从JNs读取edit logs,并时刻监控JNs(只要Edit Logs有改动就同步),因为Standy node在时刻监控,就可以保证在故障转移发生时,Standby node的edit Logs与Active node完全一致,从而直接切换成Active状态。
为了实现快速故障转移,Standby node必须清楚集群中数据块的位置,为datanodes配置这2个Namenods(Active/Standby),并且datanodes同时向两个namenodes发送块信息和心跳。
在HDFS HA集群中,必须保证只有一个Active节点,否则会造成错误和混乱。
2. 硬件资源:
JournalNode daemon是轻量级的,可以和其他hadoop daemons(namenode,resourcemanager等)共同运行在一台主机。JournalNode主机和Zookeeper主机很相似,必须要有奇数个(2N+1)主机(最少3个),其中N代表可以宕机的数量,如果宕机的数量超过了N,JournalNode集群就不可用了。
Standby namenode不可以代替Secondary Node的作用。
5. Namenode HA搭建配置和测试:
Namenode HA资源规划设计:
Namenode HA资源配置Namenode HA只涉及到HDFS角色,在hadoop-senior01.pmpa.com上安装Namenode(Active),在hadoop-senior02.pmpa.com上安装Namenode(Standby)。与yarn资源不冲突。
1. 先备份之前的hadoop安装目录:
先停掉hdfs 和 yarn(拷贝文件夹前最好先停掉应用),在senior01上执行,停掉hdfs:
$ sbin/stop-dfs.sh
在senior02上执行,停掉yarn:
$ sbin/stop-yarn.sh
备份hadoop安装目录(Senior01):
$ cp -ra hadoop-2.5.0/ hadoop-2.5.0_bak
下面根据官方文档来配置HDFS HA:
2. Namenode HA配置:
(1)配置NN HA需要配置 hdfs-site.xml。
a). 配置一个服务组名称,默认名字是mycluster(可任意修改), 配置项:dfs.nameservices。
b). 配置JournalNodes,默认端口是8485,配置项:dfs.namenode.shared.edits.dir。设计图中的 “SHARED EDITS”角色。
c). 配置JournalNodes的本地保存目录,一般情况下会在$HADOOP_HOME/data下创建一个dn目录指定之,当然可以任意指定,配置项:dfs.journalnode.edits.dir
d). 配置代理Proxy,客户端的访问入口设置为代理,不再是之前的单独namenode。配置项:dfs.client.failover.proxy.provider.mycluster。
e). 配置隔离,采用的sshfence,这一项为了保证两台namenode只有一台是active状态,正常情况下只有一台namenode对外提供服务。
(2)配置core-site.xml:
a). 配置hdfs的访问入口:访问入口需要修改成mycluster, 配置项:fs.defaultFS。
两个配置文件内容如下:
3.同步配置:
(1)在senior02和senior03上创建 jn目录(保存journal node文件):
$ mkdir jn
(2)上边修改了core-site.xml 和 hdfs-site.xml,将这2个配置文件同步senior02和senior03。
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior02.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior03.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
4. HA with QJM 启动:
(1)启动 JournalNode,需要在三个节点上执行:
$ sbin/hadoop-daemon.sh start journalnode
这时使用jps 可以看到 JournalNode 进程。
(2)在[nn1]上格式化,并启动namenode:
$ bin/hdfs namenode -format
$ sbin/hadoop-daemon.sh start namenode
(3)在[nn2]上同步[nn1]的元数据信息:
$ bin/hdfs namenode --help
$ bin/hdfs namenode -bootstrapStandby
上边要在nn2上执行,nn2向nn1同步一次元数据信息。
(4)在[nn2]上启动namenode:
$ sbin/hadoop-daemon.sh start namenode
(5)将[nn1]切换成Active:
$ bin/hdfs haadmin -transitionToActive nn1
(6)在[nn1]上启动所有datanode:
$ sbin/hadoop-daemon.sh start datanode
(7)测试[nn1]和[nn2]的状态:
可以浏览器访问namenode 50070端口,能够发现一个是active,一个是standby的状态。分别访问:http://hadoop-senior01.pmpa.com:50070/ 和 http://hadoop-senior02.pmpa.com:50070/
nn1 Namnode -----Active nn2 Namenode ---- Standby我们可以上传一个测试文件到HDFS,在Active 节点中可以浏览到该文件,在Standby节点,提示“Operation category READ is not supported in state standby”。
下面把nn1 改成standby状态,再来查看这两个页面(手动切换Active/Standby)
$ bin/hdfs haadmin -transitionToStandby nn1
$ bin/hdfs haadmin -transitionToActive nn2
6. Namenode HA 实现自动故障转移:
Namenode HA实现自动故障转移:
Namenode实现自动故障转移Namenode HA 自动故障转移,需要借助Zookeeper来完成。使用ZKFC组件来协助完成。
HDFS HA Using QJM1. 配置自动故障转移:
(1) 在hdfs-site.xml开启自动故障转移,配置项:dfs.ha.automatic-failover.enabled。
(2)在core-site.xml配置Zookeeper的HA,配置项:ha.zookeeper.quorum
(3)同步更改到其他服务器:
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior02.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior03.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
2. 启动Zookeeper自动故障转移:
(1)关闭hdfs:
$ sbin/stop-dfs.sh
(2)启动zookeeper(每台机器启动):
$ bin/zkServer.sh start
(3)初始化HA在Zookeeper集群中的状态(在其中一台Namenode上运行):
$ bin/hdfs zkfc -formatZK
(4)启动hdfs 服务:
$ sbin/start-dfs.sh
使用start-dfs.sh 启动hdfs后,也会启动zkfc。
可以直接在各个Namenode节点上启动DFSZK Failover Controller ,通过jps可查看到DFSZKFailoverController进程。
通过sbin/hadoop-daemon.sh ,可以选择在nn1 和nn2上哪个先启动zkfc。在哪台Namenode上先启动,哪台就是Active状态(另外的就是Standby状态)。
$ sbin/hadoop-daemon.sh start zkfc
3. 测试Zookeeper 自动故障转移:
启动了HDFS之后,在浏览器访问50070端口,确定senior02是Active状态、Senior01是Standby状态。现在通过在nn2上杀掉Namenode进程(模仿Senior02故障,看看Senior01是否能够自动切换到Active状态)。
$ jps
12017 DFSZKFailoverController
5675 QuorumPeerMain
11803 DataNode
11730 NameNode
11892 JournalNode
12119 Jps
$ kill -9 11730
在senior02上杀掉namenode进程后,可以在senior01的50070端口访问,看到已经切换到Active状态。
Senior01 切换到Active状态7. ResourceManager HA 介绍:
1. RM HA介绍:
Resource Manager负责集群中资源跟踪、分配和应用的调度(例如作业调度)。在Hadoop 2.4版本之前,Yarn集群中的Resource Manager存在单点故障。RM HA添加了一组冗余的Active/Standby Resource Manager来防止单点故障。
2. Resource Manager HA架构:
RM HA Architecture1. RM记录的状态:
(1)Job任务的状态,
(2)资源状态,每个任务。
假如一个任务需要执行一小时,Job在执行到半小时的时候Resource Manager出错,配置的RM HA应该可以直接切换到Standby RM,并且这个任务应该继续执行后半小时内容,不应该重新执行,这样会很耗时。
RM的状态是记录在Zookeeper中的。
2. Zookeeper作用
(1)监控ResourceManager ;
(2)切换active/standy状态;
(3)保存状态:
a) Job任务的状态
b) 资源的状态
8. ResourceManager HA 搭建配置和测试:
1. 资源主机规划:
下面是资源主机规划安装列表:
RM HA 资源规划列表修改mapred-site.xml来修改jobhisotry的配置节点(原来在senior03,现在切回到senior01)。
停掉jobhistoryserver:
$ sbin/mr-jobhistory-daemon.sh stop historyserver
2. RM HA配置:
需要修改配置文件yarn-site.xml:
可以按照官网的sample configuration 来进行配置,官网地址: ResourceManagerHA
实现RM HA需要保证Resource Manager的自动重启,所以还增加Resource Manager Restart的配置。在保存RM状态时,有两种方式,一个是保存在Zookeeper中(架构图中情况),一种是保存在HDFS中。 关于RM Restart的参考,官网地址:ResourceManagerRestart
保存到Zookeeper和hdfs的状态的两个类分别是:
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore
3. 配置同步,rm启动
(1)同步配置:
同步配置到其他两台服务器,我修改了yarn-site.xml和mapred-site.xml:
$ scp etc/hadoop/yarn-site.xml etc/hadoop/mapred-site.xml natty@hadoop-senior02.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp etc/hadoop/yarn-site.xml etc/hadoop/mapred-site.xml natty@hadoop-senior03.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
(2)启动rm1 和 rm2:
a) 在senior02上启动 yarn:
$ sbin/start-yarn.sh
上边操作会启动senior02的resource manager和三台服务器的node manager。
b) 在senior03上启动resource manager:
$ sbin/yarn-daemon.sh start resourcemanager
c) 查看两个Resource Manager 的状态:
查看rm1的状态(active状态):
$ bin/yarn rmadmin -getServiceState rm1
查看rm2的状态(standby状态):
$ bin/yarn rmadmin -getServiceState rm2
d) 启动 jobhistoryserver:
$ sbin/mr-jobhistory-daemon.sh start historyserver
4. 测试RM HA ,通过调度任务来测试:
调度一个wordcount任务:
$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /words.txt /output20
任务正常执行完,现在rm1(Senior02)是active rm2(Senior03)是standby。
下面在任务执行过程中(到map阶段),我把senior02的resource manager进程kill掉,按照分析rm2应该自动切换为active,并且继续执行任务。
在senior01上调度任务,执行日志如下:
RM HA 测试日志通过日志,可以看到,在rm1的resourcemanager进程杀掉后,自动切换到rm2,作业继续执行,最后执行成功。