一、首先谈一谈zookeeper的选举机制
注:高可用集群中有两台机器作为namenode,无论在任何时候,集群中只能有一个namenode作为active状态,而另一个是standby状态,为了达到namenode快速容错的目的,引入zookeeper后,hadoop-ha可以在active的namenode出问题时由standby自动切换为active状态
特征
leader 投票发起和决议,更新系统状态(只能有一个,否则出现脑裂现象)
follower 参与选举,处理并反馈客户请求
为了保证zookeeper的可用性,集群中至少由3个zookeeper节点组成(确保某一节点死亡可以由选举机制从另外两个节点选出一个作为leader,对外继续提供服务,它的存活条件为半数以上的节点存活)
选举机制如此例:
预设5台:
1、2分别启动后因为未过半都处于观望
3启动后,1、2、3都选择3,数量过半因此3为leader,1、2为follower
4、5启动后因为领导已经产生,则自动沦为follower二、zookeeper的配置
# 需要提前准备好jdk环境
# 解压步骤省略
# 创建目录:
mkdir zookeeper
# 建立软连接:
ln -s zookeeper345/ zookeeper/
# 创建数据目录:
mkdir zookeeper/zkdata
# 修改zookeeper配置文件:
cd /opt/bigdata/hadoop/zookeeper345/conf
zoo.sample.cfg zoo.cfg--配置信息
tickTime=2000 毫秒,服务器和客户端之间,服务器之间心跳间隔,最小超时为2倍
initLimit=10 follower启动后与leader之间同步数据,并且确定可以对外服务状态的最大时限为10*tickTime
syncLimit=5 follower和leader之间如果在syncLimit*tickTime时间内无法通过心跳确认,则leader判定该follower死亡,移出服务列表
dataDir=/opt/bigdata/hadoop/zookeeper/zkdata
clientPort=2181
server.1=vwmaster:2888:3888
server.2=vwslave01:2888:3888
server.3=vwslave02:2888:3888
server.4=vwslave03:2888:3888# 在zkdata目录中创建myid文件,并将当前host下对应的服务器编号1/2/3/4存在其中
# 配置环境变量:
export ZK_HOME=/opt/bigdata/hadoop/zookeeper345
export PATH=$ZK_HOME/bin:$ZK_HOME/sbin:$PATH
# 激活环境变量:
source /etc/profile
[root@vwslave01 ~]# start
三、高可用原理
在高可用集群中有两个namenode,其中一个为active,另一个作为standby,active的namenode负责集群中所有的客户端操作,而原来的secondaryNamenode也不需要了,数据交互由轻量级进程journalNode完成,对于任何由主namenode的修改操作,standby的namenode监测到之后会同步journalnode里面的修改log,当active namenode挂了后会读取journalnode里面的修改日志,接替它的位置并保证数据的同步。
而namenode的健康状态的判定由zookeeper决定,在每个namenode启动时,会在zookeeper上注册一个持久化节点,而zookeeper提供一个znode(独占锁)获取master的功能,两个namenode谁得到谁就是active状态,另一个保持standby,实际工作中hadoop会提供一个ZKFailoverControl角色在每个主节点周期性的探测namenode的健康状态,当它出问题了独占锁将会给备份的namenode代替原来的主机负责其职责

四、搭建方法
关于NameNode高可靠需要配置的文件有core-site.xml和hdfs-site.xml
关于ResourceManager高可靠需要配置的文件有yarn-site.xml
时间同步
本地时钟服务器搭建
rmp -qa|grep ntp
yum -y remove ntpdate-4.2.6p5-29.e17.centos.x86_64
安装ntp yum -y install ntp
修改所有节点的/etc/ntp.conf
restrict 20.0.0.100 nomodify notrap nopeer noquery //当前节点ip
restrict 20.0.0.2 mask 255.255.255.0 nomodify notrap //集群所在网段网关Gateway,子网掩码Netmask
主节点
#server 0.centos.pool.ntp.org iburst
#server iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0
Fudge 127.127.1.0 stratum 10
从节点
#server 0.centos.pool.ntp.org iburst
#server iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 20.0.0.100 //主节点ip
Fudge 20.0.0.100 stratum 10
启动ntp服务 service ntpd start
设置开机启动 chkconfig ntpd on
查看 ntpstat
以下配置均为hadoop260/etc/hadoop目录下
注:提前在hadoop260下建目录data(cd data, mkdir pids journalnode)
hadoop core-site.xml配置
<configuration>
<!--设定集群访问路径:kbcluster-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://kbcluster</value>
</property>
<!--设定临时目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/bigdata/hadoop/hadoop260/data/tmp</value>
</property>
<!--设定zookeeper集群目录-->
<property>
<name>ha.zookeeper.quorum</name>
<value>vwmaster:2181,vwslave01:2181,vwslave02:2181,vwslave03:2181</value>
</property>
</configuration>hadoop hdfs-site.xml
<configuration>
<!--设定文件块备份数-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--设定集群服务名称:kbcluster-->
<property>
<name>dfs.nameservices</name>
<value>kbcluster</value>
</property>
<!--设定集群kbcluster的namenode自定义名称列表-->
<property>
<name>dfs.ha.namenodes.kbcluster</name>
<value>nn1,nn2</value>
</property>
<!--分别设定所有namenode名称列表的rpc访问地址-->
<property>
<name>dfs.namenode.rpc-address.kbcluster.nn1</name>
<value>vwmaster:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.kbcluster.nn2</name>
<value>vwslave01:9000</value>
</property>
<!--分别设定所有namenode名称列表的http访问地址-->
<property>
<name>dfs.namenode.http-address.kbcluster.nn1</name>
<value>vwmaster:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.kbcluster.nn2</name>
<value>vwslave01:50070</value>
</property>
<!--设定所有节点的共享编辑日志journal地址列表-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://vwmaster:8485;vwslave01:8485;vwslave02:8485;vwslave03:8485/kbcluster</value>
</property>
<!--设定隔离方法名称:即同一时刻只能有一台服务器对外响应--->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--使用隔离机制是需要私钥进行无秘访问-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--设定journal节点存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/bigdata/hadoop/hadoop260/data/journalnode</value>
</property>
<!--关闭权限检查-->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--启动client访问失败动态代理-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--设置client访问失败自动切换代理-->
<property>
<name>dfs.client.failover.proxy.provider.kbcluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>hadoop yarn-site.xml
<configuration>
<!--设置nodemanager附属服务-->
<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>kbcluster-yarn</value>
</property>
<!--启用resourcemanager(ha)集群的resoucemanager名称列表-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--分别设置resourcemanager(ha)集群的resoucemanager名称的hostname-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>vwmaster</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>vwslave01</value>
</property>
<!--设置resourcemanager(ha)集群的zookeepr集群地址列表-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>vwmaster:2181,vwslave01:2181,vwslave02:2181,vwslave03:2181</value>
</property>
<!--启用resourcemanager(ha)集群可恢复功能-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager(ha)集群的状态信息存储在zookeepr集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>初始化hadoop ha集群
分别启动所有节点上的journalnode服务 start journalnode
nn1上格式化 hdfs namenode -format start namenode(启动主节点)
nn2上同步nn1上的元数据信息 hdfs namenode -bootstrapStandby start namenode #启动后通过网页测试
nn1上启动hadoop ha集群
单独启动nn2上的resourcemanager start resourcemanager
网页上可查状态 ip:50070
















