基于Zookeeper的Hadoop HA集群的搭建
JunLeon——go big or go home
?前言:
????????高可用(high availability,HA)指的是若当前工作中的机器宕机了,系统会自动处理异常,并将工作无缝地转移到其他备用机器上,以保证服务的高可靠性与可用性。
????????Hadoop HA是hadoop2.0后新添加的特性,包括NameNode HA和ResourceManager HA。
????????NameNode HA采用双NameNode进行高可用,克服hadoop1.x中的单点问题。运行后,一个NameNode处于active状态,则另一处于standby状态。active NameNode节点对外提供服务,而standby NameNode节点不对外提供服务,仅仅同步active NameNode节点的状态,以便在active NameNode节点失效时快速切换继续提供服务。
????????Zookeeper是一个分布式协调服务,Zookeeper即可用来保证Hadoop集群的高可用性。通过zookeeper集群与Hadoop2.X中的两个NameNode节点之间的通信,保证集群中总有一个可用的NameNode(即active NameNode),从而实现双NameNode节点构成的NameNode HA,达到HDFS高可用性。同Zookeeper也可用来保证ResourceManager HA,即实现YARN高可用性。
说明:
该篇Zookeeper的安装及Hadoop HA的配置是基于Hadoop分布式的基础上去操作的,所用的命令都是在root用户下执行,hadoop的安装路径为:/opt/hadoop-2.7.3
Hadoop分布式的安装请查看:大数据学习——Hadoop集群完全分布式的搭建(超详细)_JunLeon的博客-CSDN博客
1、安装配置Zookeeper集群
? ? ? ? Zookeeper集群由基数台机器组成,分为leader和follower两个角色。写入数据时,要写入leader,leader同意后,再通知follower写入。客户端读取数据时,由于数据都是一样的,可以从任意一台机器上读取。而leader是选举出来的,集群中任意一台机器发现没有leader时,则会推荐自己为leader,当超过半数的机器同意它为leader时,选举结束。这样当leader宕机后很快就会选举出新的leader,保证工作正常进行。
(1)下载并上传解压Zookeeper安装包
-
环境准备
官网下载:Index of /zookeeper,自行选择版本下载即可
我使用的是zookeeper-3.4.12版本,如需下载:百度云链接:百度网盘 请输入提取码 提取码:8888
-
上传解压安装
使用XShell或者其他远程连接工具连接虚拟机进行上传到Linux系统的/opt/目录下
执行命令解压上传后的压缩包:
tar -zxvf /opt/zookeeper-3.4.12.tar.gz -C /opt/
-
配置环境变量
vi /etc/profile
以下包括jdk、hadoop的环境变量配置:
export JAVA_HOME=/opt/jdk1.8.0_161
export HADOOP_HOME=/opt/hadoop-2.7.3
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.12
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$PATH
添加ZOOKEEPER_HOME变量:
使配置文件生效:
source /etc/profile
(2)修改配置文件
1 生成配置文件zoo.cfg
进入zookeeper 主目录下的conf 目录,将zoo_sample.cfg 复制一份为zoo.cfg 文件
cd /opt/zookeeper-3.4.12/conf
cp zoo_sample.cfg zoo.cfg
2 dataDir属性设置Zookeeper的数据存放的位置
vi zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
参数说明:
tickTime=2000 表示zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,时间单位是毫秒
initLimit=10 表示Zookeeper服务器集群中连接到leader的Follower服务器初始化连接是最长能忍受多少个心跳的时间间隔数,总的时间长度就是10*2000=20秒。
syncLimit=5 表示标识leader与follower之间发送消息,请求和应答时间长度。最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。
dataDir=/tmp/zookeeper 表示zookeeper的数据存放目录,默认在/tmp/zookeeper,此为修改项,默认情况下Zookeeper将写数据的日志文件也保存在这个目录里,也可以手动指定日志存放的目录。
clientPort=2181 表示客户端(应用程序)连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求,默认为2181。
进入zoo.cfg文件后,定位到12行,配置Zookeeper数据存放的路径:
dataDir=/opt/zookeeper-3.4.12/data/zData
3 指定Zookeeper集群中各个节点的信息
vi zoo.cfg
打开zoo.cfg文件,在末尾添加如下几行
server.1=BigData01:2888:3888
server.2=BigData02:2888:3888
server.3=BigData03:2888:3888
各个节点的信息格式为: server.X=A:B:C
X-->指zookeeper节点的myid,标识这个是第几号服务器。
A-->指每个节点的IP地址或者主机名。
B-->指follower和leader交换消息所使用的端口。
C-->指选举leader所使用的端口。
注:server后面的数字是1到255,所以Zookeeper集群最多可以有255台机器。
3 创建myid文件
在Zookeeper主目录下创建dataDir指定的目录
mkdir -p data/zData
在创建好的目录下创建一个文件,文件名为myid,并输入id
cd /opt/zookeeper-3.4.12/data/zData
vi myid
输入1即可,另外两台节点分别为2、3
4 配置好的Zookeeper分发到其他节点
scp -r /opt/zookeeper-3.4.12 root@BigData02:/opt
scp -r /opt/zookeeper-3.4.12 root@BigData03:/opt
配置另外两台机器的myid,分别配置2、3
5 启动Zookeeper 集群及查看状态
启动Zookeeper命令:
在启动Zookeeper之前,首先关闭防火墙:service iptables stop
zkServer.sh start # 需要在每一台机器上执行此命令
查看Zookeeper命令:
zkServer.sh status
此时能查看到其中有一台被选举为leader,另外两台为follower
?如果查看状态时出现如下问题:
?注:可能是防火墙没有关闭,关闭防火墙即可
关闭Zookeeper命令:
zkServer.sh stop
2、高可用分布式集群节点规划
????????本环境是在前面分布式的基础上增加的Zookeeper环境搭建,并采取Hadoop的双NameNode来保证HDFS的高可用性,故把Secondary NameNode改成NameNode。其中ResourceManager服务记录着当前集群的资源分配情况和Job的运行状态,可能会出现单点故障问题,故增加一个ResourceManager服务节点,并利用Zookeeper来实现ResourceManager自动故障转移,从而保证ResourceManager HA,实现YARN的高可用性。
节点规划
服务(角色) | BigData01 (192.168.182.10) | BigData02 (192.168.182.20) | BigData03 (192.168.182.30) |
---|
NameNode | √ | √ | | DataNode | √ | √ | √ | ResourceManager | √ | √ | | NodeManager | √ | √ | √ | Zookeeper | √ | √ | √ | JobHistoryServer | | | √ |
注:比较Hadoop分布式集群规划,将Secondary NameNode改为NameNode,采用了双ResourceManager,多了zookeeper节点。
3、安装配置Hadoop HA集群
因在Hadoop分布式的基础上进行配置,故无密码登录不做详细讲解,包括hadoop-env.sh、yarn-site.xml、mapred-site.xml、slaves等文件配置,详情请参照:大数据学习——Hadoop集群完全分布式的搭建(超详细)_JunLeon的博客-CSDN博客
(1)配置文件
-
配置hadoop-env.sh文件 vi /opt/hadoop-2.7.3/etc/hadoop/hadoop-env.sh #在25行配置java路径即可 配置此文件和hadoop完全分布式配置一样,可以不用去配置 -
配置core-site.xml文件 vi /opt/hadoop-2.7.3/etc/hadoop/core-site.xml 在<configuration> 中配置: <configuration>
? ?<property>
? ? ? ?<!-- 指定HDFS的通信地址,在NameNode HA中连接到nameservice的,
值为mycluster是需要在下一个hdfs-site.xml中配置的 -->
? ? ? ?<name>fs.defaultFS</name>
? ? ? ?<value>hdfs://mycluster</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 指定hadoop的临时目录,默认情况下NameNode和DataNode产生的数据都会存放在该路径 -->
? ? ? ?<name>hadoop.tmp.dir</name>
? ? ? ?<value>/opt/hadoopHA/tmp</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 指定Zookeeper地址(2181端口参考zoo.cfg配置文件) -->
? ? ? ?<name>ha.zookeeper.quorum</name>
? ? ? ?<value>BigData01:2181,BigData02:2181,BigData03:2181</value>
? ?</property>
</configuration> -
配置hdfs-site.xml文件 vi /opt/hadoop-2.7.3/etc/hadoop/hdfs-site.xml 在<configuration> 中配置: <configuration>
? ?<property>
? ? ? ?<!-- 给NameNode集群定义一个services name(NameNode集群服务名) -->
? ? ? ?<name>dfs.nameservices</name>
? ? ? ?<value>mycluster</value>
? ?</property>
? ?<property>
? ? ? ? <!-- 设置nameservices包含的NameNode名称,分别命名为nn1,nn2 -->
? ? ? ?<name>dfs.ha.namenodes.mycluster</name>
? ? ? ?<value>nn1,nn2</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 设置名为nn1的NameNode的RPC的通信地址和端口号 -->
? ? ? ?<name>dfs.namenode.rpc-address.mycluster.nn1</name>
? ? ? ?<value>BigData01:9000</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 设置名为nn1的NameNode的HTTP的通信地址和端口号 -->
? ? ? ?<name>dfs.namenode.http-address.mycluster.nn1</name>
? ? ? ?<value>BigData01:50070</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 设置名为nn2的NameNode的RPC的通信地址和端口号 -->
? ? ? ?<name>dfs.namenode.rpc-address.mycluster.nn2</name>
? ? ? ?<value>BigData02:9000</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 设置名为nn2的NameNode的HTTP的通信地址和端口号 -->
? ? ? ?<name>dfs.namenode.http-address.mycluster.nn2</name>
? ? ? ?<value>BigData02:50070</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 设置NameNode的元数据在JournalNode上的存放路径
(即NameNode集群间的用于共享的edits日志的journal节点列表) -->
? ? ? ?<name>dfs.namenode.shared.edits.dir</name>
? ? ? ?<value>qjournal://BigData01:8485;BigData02:8485;BigData03:8485/mycluster</value>
? ?</property>
? ?<property>
? ? ? ? <!-- 指定JournalNode上存放的edits日志的目录位置 -->
? ? ? ?<name>dfs.journalnode.edits.dir</name>
? ? ? ?<value>/opt/hadoopHA/tmp/dfs/journal</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 开启NameNode失败自动切换 -->
? ? ? ?<name>dfs.ha.automatic-failover.enabled</name>
? ? ? ?<value>true</value>
? ?</property>
? ?<property>
? ? ? ? <!-- 配置NameNode失败后自动切换实现方式(客户端连接可用状态的NameNode所用的代理类) -->
? ? ? ?<name>dfs.client.failover.proxy.provider.mycluster</name>
? ? ? ?<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
? ?</property>
? ?<property>
? ? ? ? <!-- 配置隔离机制 -->
? ? ? ?<name>dfs.ha.fencing.methods</name>
? ? ? ?<value>sshfence</value>
? ?</property>
? ?<property>
? ? ? ? <!-- 设置使用隔离机制时需要的SSH免密登录 -->
? ? ? ?<name>dfs.ha.fencing.ssh.private-key-files</name>
? ? ? ?<value>/root/.ssh/id_rsa</value>
? ?</property>
? ?<property>
? ? ? ? <!-- 设置HDFS副本数量 -->
? ? ? ?<name>dfs.replication</name>
? ? ? ?<value>3</value>
? ?</property>
? ?<property>
? ? ? ? <!-- 设置NameNode存放的路径 -->
? ? ? ?<name>dfs.namenode.name.dir</name>
? ? ? ?<value>/opt/hadoopHA/tmp/dfs/name</value>
? ?</property>
? ?<property>
? ? ? ? <!-- 设置DataNode存放的路径 -->
? ? ? ?<name>dfs.datanode.data.dir</name>
? ? ? ?<value>/opt/hadoopHA/tmp/dfs/data</value>
? ?</property>
</configuration> -
配置yarn-site.xml文件 vi /opt/hadoop-2.7.3/etc/hadoop/hdfs-site.xml 在<configuration> 中配置: <configuration>
? ?<property>
? ? ? ?<!-- 启用ResourceManager的HA功能 -->
? ? ? ?<name>yarn.resourcemanager.ha.enabled</name>
? ? ? ?<value>true</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 开启ResourceManager失败自动切换 -->
? ? ? ?<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
? ? ? ?<value>true</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 给ResourceManager HA集群命名id -->
? ? ? ?<name>yarn.resourcemanager.cluster-id</name>
? ? ? ?<value>yarn-cluster</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 指定ResourceManager HA有哪些节点 -->
? ? ? ?<name>yarn.resourcemanager.ha.rm-ids</name>
? ? ? ?<value>rm1,rm2</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 指定第一个节点在那一台机器 -->
? ? ? ?<name>yarn.resourcemanager.hostname.rm1</name>
? ? ? ?<value>BigData01</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 指定第二个节点在那一台机器 -->
? ? ? ?<name>yarn.resourcemanager.hostname.rm2</name>
? ? ? ?<value>BigData02</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 指定ResourceManager HA所用的Zookeeper节点 -->
? ? ? ?<name>yarn.resourcemanager.zk-address</name>
? ? ? ?<value>BigData01:2181,BigData02:2181,BigData03:2181</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 启用RM重启的功能,默认为false -->
? ? ? ?<name>yarn.resourcemanager.recovery.enabled</name>
? ? ? ?<value>true</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 用于状态存储的类 -->
? ? ? ?<name>yarn.resourcemanager.store.class</name>
? ? ? ?<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
? ?</property>
? ?<property>
? ? ? ?<!-- NodeManager启用server的方式 -->
? ? ? ?<name>yarn-nodemanager.aux-services</name>
? ? ? ?<value>mapreduce_shuffle</value>
? ?</property>
? ?<property>
? ? ? ?<!-- NodeManager启用server使用算法的类 -->
? ? ? ?<name>yarn-nodemanager.aux-services.mapreduce.shuffle.class</name>
? ? ? ?<value>org.apache.hadoop.mapred.ShuffleHandler</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 启用日志聚合功能 -->
? ? ? ?<name>yarn.log-aggregation-enable</name>
? ? ? ?<value>true</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 聚集的日志在HDFS上保存最长的时间 -->
? ? ? ?<name>yarn.log-aggregation.retain-seconds</name>
? ? ? ?<value>106800</value>
? ?</property>
? ?<property>
? ? ? ?<!-- 聚集的日志在HDFS上保存最长的时间 -->
? ? ? ?<name>yarn.nodemanager.remote-app-log-dir</name>
? ? ? ?<value>/opt/hadoopHA/logs</value>
? ?</property>
</configuration> 以下配置属于默认的配置,有时运行MapReduce并行计算处理任务是=时出错而导致任务失败,故可以将以下配置参数加到yarn-site.xml文件内 <property>
? ?<!-- ApplicationMaster通过该地址向RM申请资源、释放资源,
本设置是ResourceManager对ApplicationMaster暴露的地址 -->
? ?<name>yarn.resourcemanager.scheduler.address.rm1</name>
? ?<value>BigData01:8030</value>
</property>
<property>
? ?<!-- NodeManager通过该地址交换信息 -->
? ?<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
? ?<value>BigData01:8031</value>
</property>
<property>
? ?<!-- 客户机通过该地址向RM提交对应应用程序操作 -->
? ?<name>yarn.resourcemanager.address.rm1</name>
? ?<value>BigData01:8032</value>
</property>
<property>
? ?<!-- 管理员通过该地址向RM发送管理命令 -->
? ?<name>yarn.resourcemanager.admin.address.rm1</name>
? ?<value>BigData01:8033</value>
</property>
<property>
? ?<!-- RM HTTP访问地址,查看集群信息 -->
? ?<name>yarn.resourcemanager.webapp.address.rm1</name>
? ?<value>BigData01:8088</value>
</property>
<property>
? ?<!-- 同rm1对应内容 -->
? ?<name>yarn.resourcemanager.scheduler.address.rm2</name>
? ?<value>BigData02:8030</value>
</property>
<property>
? ?<!-- NodeManager通过该地址交换信息 -->
? ?<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
? ?<value>BigData02:8031</value>
</property>
<property>
? ?<!-- 客户机通过该地址向RM提交对应应用程序操作 -->
? ?<name>yarn.resourcemanager.address.rm2</name>
? ?<value>BigData02:8032</value>
</property>
<property>
? ?<!-- 管理员通过该地址向RM发送管理命令 -->
? ?<name>yarn.resourcemanager.admin.address.rm2</name>
? ?<value>BigData02:8033</value>
</property>
<property>
? ?<!-- RM HTTP访问地址,查看集群信息 -->
? ?<name>yarn.resourcemanager.webapp.address.rm2</name>
? ?<value>BigData02:8088</value>
</property> -
配置mapred-site.xml文件
配置此文件和hadoop完全分布式的MapReduce配置一样,可以不用去配置
-
配置slaves文件
配置此文件和hadoop完全分布式的slaves配置一样,可以不用去配置
(2)将配置好的文件分发到其他节点上
scp ?-r /opt/hadoop-2.7.3/etc/hadoop root@BigData02:/opt/hadoop-2.7.3/etc/
scp ?-r /opt/hadoop-2.7.3/etc/hadoop root@BigData03:/opt/hadoop-2.7.3/etc/
(3)格式化NameNode
格式化之前先启动journalnode 节点
hadoop-daemon.sh start journalnode #三台机器都要执行该命令
格式化:
hdfs namenode -format #格式化HDFS
hdfs zkfc -formatZK #格式化Zookeeper
如果没有先启动journalnode 节点,格式化出现以下问题:8485拒绝连接
如果启动journalnode 还是出现上面问题, 可以在core-site.xml 文件中添加如下参数:
<!--修改core-site.xml中的ipc参数,防止出现连接journalnode服务ConnectException-->
<property>
? ?<name>ipc.client.connect.max.retries</name>
? ?<value>100</value>
? ?<description>Indicates the number of retries a client will make to establish a server connection.</description>
</property>
<property>
? ?<name>ipc.client.connect.retry.interval</name>
? ?<value>10000</value>
? ?<description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description>
</property>
注意:配置这两个参数化,NameNode稳定运行,但是格式化花的时间比较长,请耐心等待。
(4)启动/停止集群
启动集群命令:
开启全部节点(启动HDFS和YARN)
start-all.sh #启动HDFS和YARN
启动Zookeeper
hadoop-daemon.sh start zkfc #三台机器都要执行
启动HistoryServer节点(在BigData03机器上执行)
mr-jobhistory-daemon.sh start historyserver
单独启动HDFS和YARN
start-hdfs.sh #启动HDFS
start-yarn.sh #启动YARN
验证(查看是否启动成功)
jps
停止集群命令:
停止全部节点
stop-all.sh #停止HDFS和YARN
单独停止HDFS和YARN
stop-hdfs.sh #停止HDFS
stop-yarn.sh #停止YARN
(5)Web端访问
?
4、查询集群信息及测试HDFS高可用性
(1)验证HDFS的高可用性
(2)验证YARN的高可用性
|