Hadoop(五)zookeeper 搭建高可用集群
############################################---------- zookeeper 安装 -------------###############################
zookeeper
特征
leader 投票发起和决议,更新系统状态
follower 参与【选举】,处理并反馈客户请求
预设5台:
1、2分别启动后因为未过半都处于观望
3启动后,1、2、3都选择3,数量过半因此3为leader,1、2为follower
4、5启动后因为领导已经产生,则自动沦为follower
zookeeper存活条件 半数以上节点活(节点数量为奇数)
全局数据一致 每个服务器都是一个相同的副本,数据一致,客户端连接上哪台服务器都可以
所有客户端的请求 同一个用户会根据发送请求的先后顺序依次处理
数据更新原子性 单次数据更新只有成功和失败两种可能性
数据更新实时性 在一定的时间内,client可以读到最新数据
数据结构如图
# 需要提前准备好jdk环境
# 解压步骤省略
# 切换目录:
cd /opt/bigdata/hadoop
# 创建目录:
mkdir zookeeper
# 建立软连接:
ln -s zookeeper345/ zookeeper/
# 创建数据目录:
mkdir zookeeper/zkdata
# 修改zookeeper配置文件:
cd /opt/bigdata/hadoop/zookeeper345/conf
# 重命令 zoo.sample.cfg
mv zoo.sample.cfg zoo.cfg
vi 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=vbserver:2888:3888
server.2=vmslave1:2888:3888
server.3=vmslave2:2888:3888
server.4=vmslave3: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
# 复制以上过程至其他三台机器后,分别在4台机器上启动zookeeper服务 zkServer.sh stop 关闭服务
[root@vmslave1 ~]# zkServer.sh start
-----------------
JMX enabled by default
Using config: /opt/bigdata/hadoop/zookeeper345/sbin/../conf/zoo.cfg
Starting zookeeper ... STARTED
-----------------
# 在每台机器上查看服务状态
[root@vmslave1 ~]# zkServer.sh status
-----------------
JMX enabled by default
Using config: /opt/bigdata/hadoop/zookeeper345/sbin/../conf/zoo.cfg
Mode: follower
-----------------
############################################---------- hadoop ha 安装 -------------###############################
[root@vbserver hadoop]# pwd
/opt/bigdata/hadoop/hadoop260/etc/hadoop
#----------------hadoop evironment-----------------#
[root@vbserver hadoop]# vi hadoop-env.sh
export JAVA_HOME=/opt/bigdata/java/jdk180
export HADOOP_PID_DIR=/opt/bigdata/hadoop/hadoop260/data/pids
#----------------hadoop core-site.xml-----------------#
[root@vbserver hadoop]# vi 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>vbserver:2181,vmslave1:2181,vmslave2:2181,vmslave3: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>vbserver:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.kbcluster.nn2</name>
<value>vmslave1:9000</value>
</property>
<!--分别设定所有namenode名称列表的http访问地址-->
<property>
<name>dfs.namenode.http-address.kbcluster.nn1</name>
<value>vbserver:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.kbcluster.nn2</name>
<value>vmslave1:50070</value>
</property>
<!--设定所有节点的共享编辑日志journal地址列表-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://vbserver:8485;vmslave1:8485;vmslave2:8485;vmslave3: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>vbserver</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>vmslave1</value>
</property>
<!--设置resourcemanager(ha)集群的zookeepr集群地址列表-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>vbserver:2181,vmslave1:2181,vmslave2:2181,vmslave3: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>
#——-----------------------#
在etc/hadoop下的 slaves里,配置【全部】的机器
#——---------二次格式化需要注意--------------#
1. 把全部机器的data/下文件夹变成新的 journalnode 和 pids
2. 全部机器分别启动journalnode
#----------------初始化hadoop ha集群-----------------#
#---------- 分别启动 所有节点上的journal服务 ------------#
[root@vbserver sbin]# hadoop-daemon.sh start journalnode
[root@vmslave1 sbin]# hadoop-daemon.sh start journalnode
[root@vmslave2 sbin]# hadoop-daemon.sh start journalnode
[root@vmslave3 sbin]# hadoop-daemon.sh start journalnode
#---------- nn1上格式化 ------------#
[root@vbserver sbin]# hdfs namenode -format
[root@vbserver sbin]# hadoop-daemon.sh start namenode
#---------- nn2上同步nn1上的元数据信息 ------------#
[root@vmslave1 sbin]# hdfs namenode -bootstrapStandby
[root@vmslave1 sbin]# hadoop-daemon.sh start namenode #启动后通过网页测试
#----------------启动hadoop ha集群 (建议写脚本一键启动hadoop ha集群)-----------------#
#---------- 分别启动 所有节点上的zookeepr服务 ------------#
[root@vbserver sbin]# zkServer.sh start
[root@vmslave1 sbin]# zkServer.sh start
[root@vmslave2 sbin]# zkServer.sh start
[root@vmslave3 sbin]# zkServer.sh start
#---------- nn1上启动hadoop ha集群 ------------#
[root@vbserver sbin]# start-all.sh
#---------- 单独启动nn2上的resourcemanager ------------#
[root@vmslave1 sbin]# yarn-daemon.sh start resourcemanager
#----------------关闭hadoop ha集群 (建议写脚本一键启动hadoop ha集群)-----------------#
[root@vbserver sbin]# zkServer.sh stop
[root@vmslave1 sbin]# zkServer.sh stop
[root@vmslave2 sbin]# zkServer.sh stop
[root@vmslave3 sbin]# zkServer.sh stop
#---------- nn1上启动hadoop ha集群 ------------#
[root@vbserver sbin]# stop-all.sh
#---------- 单独启动nn2上的resourcemanager ------------#
[root@vmslave1 sbin]# yarn-daemon.sh stop resourcemanager
# 将 /data/tmp/dfs/name 和 data的权限设定为777
####
高可用集群,zookeeper 启动成功,zkfc 显示启动成功。namenode节点DFSZKFailoverController进程未启动,并且web页面两个namenode都为standby状态。
原因:可能是之前对zoo.cfg文件作了修改导致的问题。
解决办法:重新格式化zkfc就可以 :hdfs zkfc -formatZK
#-------------- 服务列表列表检查 -------------#
[root@vbserver sbin]# jps
22065 NameNode
22545 DFSZKFailoverController
22753 NodeManager
22371 JournalNode
22172 DataNode
21917 QuorumPeerMain
22639 ResourceManager
[root@vmslave1 sbin]# jps
12848 NodeManager
12577 DataNode
12756 DFSZKFailoverController
13028 ResourceManager
12453 QuorumPeerMain
12666 JournalNode
12507 NameNode
[root@vmslave2 sbin]# jps
7152 NodeManager
7059 JournalNode
6970 DataNode
6908 QuorumPeerMain
[root@vmslave3 sbin]# jps
6976 JournalNode
6833 QuorumPeerMain
6887 DataNode
7070 NodeManager
#--------------- 查看 nn1 nn2 状态 --------------------#
# 通过网页检查 kbcluster nn1和nn2两个namenode resourcemanager的状态