赞
踩
原博地址:https://yq.aliyun.com/articles/703353
Hadoop NameNode官方开始支持HA集群默认是从2.0开始,之前的版本均是不支持NameNode HA的高可用的。
1.1 Hadoop HA简介
Hadoop-HA集群运作机制介绍
HDFS的HA机制详解
通过双namenode消除单点故障,以下为双namenode协调工作的特点:
A、元数据管理方式需要改变:
B、需要一个状态管理功能模块
1.2 Hadoop HA工作原理图例
HDFS的HA架构
使用 Active NameNode,Standby NameNode 两个结点解决单点问题,两个结点通过JounalNode 共享状态,采用ZKFC选举Active实时监控集群状态,自动进行故障备援。
YARN的HA架构
ResourceManager HA由一对Active,Standby结点构成,通过RMStateStore 存储内部数据和主要应用的数据及标记。
支持可替代的RMStateStore实现方式如下:
1.3Hadoop HA解决方案架构
Hadoop中的HDFS、MapReduce和YARN的单点故障解决方案架构是完全一致的。
本文将重点介绍下自动模式切换的部署方式。
什么是脑裂:脑裂是Hadoop2.X版本后出现的全新问题,从字面意思我们可以理解为“大脑分裂”;我们想一下,当一个正常人,突然出现有了两个大脑,而且这两个大脑都有自己的意识,对于这个人来说肯定是灾难性问题。同理,在Hadoop中,为了防止单点失效问题而出现了两个namenode(HA机制),这两个namenode正常情况下是起到一个失效,另一个代替的作用,但在实际运行过程中很有可能出现两个namenode同时服务于整个集群的情况,这种情况称之为脑裂。
为什么会出现脑裂:脑裂通常发生在主从namenode切换时,由于ActiveNameNode的网络延迟、设备故障等问题,另一个NameNode会认为活跃的NameNode成为失效状态,此时StandbyNameNode会转换成活跃状态,此时集群中将会出现两个活跃的namenode。因此,可能出现的因素有网络延迟、心跳故障、设备故障等。
怎么解决脑裂问题:1.新增一条心跳线,防止namennode状态无法正常传达。2.使用隔离机制,通过调用活跃节点中的隔离方法,让其主动转换为standby状态,如果该方法失效则使用远程调用执行kill -9命令杀死相应进程,如果该方法仍然无法成功隔离,管理人员可以事先在每台namenode节点中编写一个shell脚本,当出现脑裂问题时,执行该脚本来切断电源,已达到隔离目的。
2.1各主机IP规划
主机名 | IP地址 | 操作系统 | 安装软件 | 运行进程 |
---|---|---|---|---|
sre01 | 10.1.8.11 | centos7.6 | jdk、hadoop、zookeeper | NameNode、DFSZKFailoverController(zkfc)、ResourceManager |
sre02 | 10.1.8.12 | centos7.6 | jdk、hadoop、zookeeper | NameNode、DFSZKFailoverController(zkfc)、ResourceManager |
sre03 | 10.1.8.13 | centos7.6 | jdk、hadoop、zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
sre04 | 10.1.8.14 | centos7.6 | jdk、hadoop、zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
sre05 | 10.1.8.15 | centos7.6 | jdk、hadoop、zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
注意:针对HA模式,就不需要SecondaryNameNode了,因为STANDBY状态的namenode会负责做checkpoint。
2.2添加hosts信息,每台机器均需执行。
- cat <<EOF > /etc/hosts
- 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
- ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 10.1.8.11 sre01
- 10.1.8.12 sre02
- 10.1.8.13 sre03
- 10.1.8.14 sre04
- 10.1.8.15 sre05
- EOF
2.3实现root用户的免密钥登录(正式环境建议新建用户)。
- sre01到sre01、sre02、sre03、sre04、sre05免秘钥登录。
- sre02到sre01、sre02、sre03、sre04、sre05免秘钥登录。
- Ip地址和主机名均可,本文默认使用hostname的方式实现。
- ssh-keygen -t rsa # 一路回车
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre01
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre02
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre03
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre04
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre05
- ssh-keygen -t rsa # 一路回车
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre01
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre02
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre03
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre04
- ssh-copy-id -i ~/.ssh/id_rsa.pub sre05
2.4安装JDK并配置环境变量
- mkdir -p /usr/java/ /root/software && cd software
- wget https://file.bigdatasafe.org/software/jdk/jdk-8u211-linux-x64.tar.gz
- tar zxvf jdk-8u211-linux-x64.tar.gz -C /usr/java/
- cat <<EOF > /etc/profile.d/jdk.sh
- #!/bin/bash
- #作者:Adil Lau
- #联系方式:bigdatasafe@gmail.com
- export JAVA_HOME=/usr/java/jdk1.8.0_211
- export JRE_HOME=${JAVA_HOME}/jre
- export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
- export PATH=$JAVA_HOME/bin:$PATH
- EOF
- chmod a+x /etc/profile.d/jdk.sh
- source /etc/profile.d/jdk.sh
根据规划在sre01-05上面分布部署zookeeper节点。
3.1下载zookeeper并修改配置文件
- mkdir -p /home/hadoop/ /root/software && cd software
- wget https://file.bigdatasafe.org/software/zookeeper/zookeeper-3.4.14.tar.gz
- tar zxvf zookeeper-3.4.14.tar.gz -C /home/hadoop/
- mkdir -p /home/hadoop/zookeeper-3.4.14/{logs,data}
- cat <<EOF > /home/hadoop/zookeeper-3.4.14/conf/zoo.cfg
- tickTime=2000
- initLimit=10
- syncLimit=5
- dataDir=/home/hadoop/zookeeper-3.4.14/data
- dataLogDir=/home/hadoop/zookeeper-3.4.14/logs
- clientPort=2181
- autopurge.snapRetainCount=500
- autopurge.purgeInterval=24
- server.1=sre01:2888:3888
- server.2=sre02:2888:3888
- server.3=sre03:2888:3888
- server.4=sre04:2888:3888
- server.5=sre05:2888:3888
- EOF
- #sre01-05分别对应1-5,各自执行即可。
- echo "1" > /home/hadoop/zookeeper-3.4.14/data/myid
3.2配置环境变量并启动相关服务
配置环境变量
- cat <<EOF > /etc/profile.d/zookeeper.sh
- #!/bin/bash
- #作者:Adil Lau
- #联系方式:bigdatasafe@gmail.com
- export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.14/
- export PATH=$ZOOKEEPER_HOME/bin:$PATH
- EOF
- chmod a+x /etc/profile.d/zookeeper.sh
- source /etc/profile.d/zookeeper.sh
制作启动脚本
- cat <<EOF > /home/hadoop/zookeeper-3.4.14/bin/zk.sh
- #!/bin/bash
- #作者:Adil Lau
- #博客:www.bigdatasafe.org
- #目的:一键启动zookeeper集群
- #联系方式:bigdatasafe@gmail.com
- iparray=(sre01 sre02 sre03 sre04 sre05)
- user="root"
- echo "$1"
- if [ $1 = "start" ]
- then
- cmd="zkServer.sh start"
- fi
-
- if [ $1 = "stop" ]
- then
- cmd="zkServer.sh stop"
- fi
-
- cmd2="jps"
-
- for ip in ${iparray[*]}
- do
- echo "ssh to $ip"
- ssh -t $user@$ip "$cmd"
- echo "jps:"
- ssh -t $user@$ip "$cmd2"
- echo
- done
- EOF
- chmod a+x /home/hadoop/zookeeper-3.4.14/bin/zk.sh
启动或关闭zookeeper集群
- #启动方式
- /home/hadoop/zookeeper-3.4.14/bin/zk.sh start
- #停止方式
- /home/hadoop/zookeeper-3.4.14/bin/zk.sh stop
4.1下载软件并修改环境变量
- wget https://file.bigdatasafe.org/software/hadoop/hadoop-2.7.7.tar.gz
- tar zxvf hadoop-2.7.7.tar.gz -C /home/hadoop/
- mkdir -p /home/hadoop/hadoop-2.7.7/{logs,tmp,name,data,journal}
- cat <<EOF > /etc/profile.d/hadoop.sh
- #!/bin/bash
- #作者:Adil Lau
- #联系方式:bigdatasafe@gmail.com
- export HADOOP_HOME=/home/hadoop/hadoop-2.7.7
- export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- EOF
- chmod a+x /etc/profile.d/hadoop.sh
- source /etc/profile.d/hadoop.sh
4.2修改core-site.xml配置文件
- cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/core-site.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!--
- #作者:Adil Lau
- #联系方式:bigdatasafe@gmail.com
- -->
- <configuration>
- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://hadoopha</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>file:/home/hadoop/hadoop-2.7.7/tmp</value>
- </property>
- <property>
- <name>ha.zookeeper.quorum</name>
- <value>sre01:2181,sre02:2181,sre03:2181,sre04:2181,sre05:2181</value>
- </property>
- <property>
- <name>ha.zookeeper.session-timeout.ms</name>
- <value>15000</value>
- </property>
- </configuration>
- EOF
4.3修改hdfs-site.xml配置文件
- cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/hdfs-site.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!--
- #作者:Adil Lau
- #联系方式:bigdatasafe@gmail.com
- -->
- <configuration>
- <property>
- <name>dfs.namenode.name.dir</name>
- <value>file:/home/hadoop/hadoop-2.7.7/name</value>
- </property>
- <property>
- <name>dfs.datanode.data.dir</name>
- <value>file:/home/hadoop/hadoop-2.7.7/data</value>
- </property>
- <property>
- <name>dfs.replication</name>
- <value>3</value>
- </property>
- <!--HA配置 -->
- <property>
- <name>dfs.nameservices</name>
- <value>hadoopha</value>
- </property>
- <property>
- <name>dfs.ha.namenodes.hadoopha</name>
- <value>nn1,nn2</value>
- </property>
- <!--namenode1 RPC端口 -->
- <property>
- <name>dfs.namenode.rpc-address.hadoopha.nn1</name>
- <value>sre01:9000</value>
- </property>
- <!--namenode1 HTTP端口 -->
- <property>
- <name>dfs.namenode.http-address.hadoopha.nn1</name>
- <value>sre01:50070</value>
- </property>
- <!--namenode2 RPC端口 -->
- <property>
- <name>dfs.namenode.rpc-address.hadoopha.nn2</name>
- <value>sre02:9000</value>
- </property>
- <!--namenode2 HTTP端口 -->
- <property>
- <name>dfs.namenode.http-address.hadoopha.nn2</name>
- <value>sre02:50070</value>
- </property>
- <!--HA故障切换 -->
- <property>
- <name>dfs.ha.automatic-failover.enabled</name>
- <value>true</value>
- </property>
- <!-- journalnode 配置 -->
- <property>
- <name>dfs.namenode.shared.edits.dir</name>
- <value>qjournal://sre03:8485;sre04:8485;sre05:8485/hadoopha</value>
- </property>
- <property>
- <name>dfs.client.failover.proxy.provider.hadoopha</name>
- <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
- </property>
- <!--发生failover时,Standby的节点要执行一系列方法把原来那个Active节点中不健康的NameNode服务给杀掉,
- 这个叫做fence过程。sshfence会通过ssh远程调用fuser命令去找到Active节点的NameNode服务并杀死它-->
- <property>
- <name>dfs.ha.fencing.methods</name>
- <value>shell(/bin/true)</value>
- </property>
- <!--SSH私钥 -->
- <property>
- <name>dfs.ha.fencing.ssh.private-key-files</name>
- <value>/root/.ssh/id_rsa</value>
- </property>
- <!--SSH超时时间 -->
- <property>
- <name>dfs.ha.fencing.ssh.connect-timeout</name>
- <value>30000</value>
- </property>
- <!--Journal Node文件存储地址 -->
- <property>
- <name>dfs.journalnode.edits.dir</name>
- <value>/home/hadoop/hadoop-2.7.7/journal</value>
- </property>
- </configuration>
- EOF
4.4修改yarn-site.xml配置文件
- cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/yarn-site.xml
- <?xml version="1.0"?>
- <!--
- #作者:Adil Lau
- #联系方式:bigdatasafe@gmail.com
- -->
- <configuration>
- <!-- 开启RM高可用 -->
- <property>
- <name>yarn.resourcemanager.ha.enabled</name>
- <value>true</value>
- </property>
- <!-- 指定RM的cluster id -->
- <property>
- <name>yarn.resourcemanager.cluster-id</name>
- <value>yrc</value>
- </property>
- <!-- 指定RM的名字 -->
- <property>
- <name>yarn.resourcemanager.ha.rm-ids</name>
- <value>rm1,rm2</value>
- </property>
- <!-- 分别指定RM的地址 -->
- <property>
- <name>yarn.resourcemanager.hostname.rm1</name>
- <value>sre01</value>
- </property>
- <property>
- <name>yarn.resourcemanager.hostname.rm2</name>
- <value>sre02</value>
- </property>
- <!-- 指定zk集群地址 -->
- <property>
- <name>yarn.resourcemanager.zk-address</name>
- <value>sre01:2181,sre02:2181,sre03:2181,sre04:2181,sre05:2181</value>
- </property>
- <property>
- <name>yarn.nodemanager.aux-services</name>
- <value>mapreduce_shuffle</value>
- </property>
- </configuration>
- EOF
4.5修改mapred-site.xml配置文件
- cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/mapred-site.xml
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!--
- #作者:Adil Lau
- #联系方式:bigdatasafe@gmail.com
- -->
- <configuration>
- <property>
- <name>mapreduce.framework.name</name>
- <value>yarn</value>
- </property>
- <property>
- <name>mapreduce.map.memory.mb</name>
- <value>2048</value>
- </property>
- <property>
- <name>mapreduce.reduce.memory.mb</name>
- <value>2048</value>
- </property>
- </configuration>
- EOF
4.6修改slaves文件加入节点信息
- cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/slaves
- sre03
- sre04
- sre05
- EOF
4.7分发hadoop文件至其他集群节点
- scp -r /home/hadoop/hadoop-2.7.7 sre02:/home/hadoop
- scp -r /home/hadoop/hadoop-2.7.7 sre03:/home/hadoop
- scp -r /home/hadoop/hadoop-2.7.7 sre04:/home/hadoop
- scp -r /home/hadoop/hadoop-2.7.7 sre05:/home/hadoop
5.1初始化zookeeper并启动集群
zkServer.sh start
hdfs zkfc -formatZK
5.2初始化hadoop并启动集群
hadoop-daemon.sh start journalnode
hdfs namenode -format
hdfs namenode -format
hadoop-daemon.sh start namenode
- hdfs namenode -bootstrapStandby
- hadoop-daemon.sh start namenode
此时sre01和sre02均处于standby状态。
hadoop-daemon.sh start zkfc
健康状态检查:运行状态说明。
5.3 HA故障自动切换测试
**集群健康状态下,默认sre01为active状态,sre02为standby状态。
现在模拟sre01节点故障,将sre01服务终止测试sre02是否自动切换为active状态。**
- jps
- 16415 DFSZKFailoverController
- 14213 Jps
- 15626 NameNode
- kill -9 15626
此时sre02由standby状态自动切换到active状态,HA故障自动切换测试成功。
注意:生成环境中由于ResourceManager消耗资源过多,建议是单独部署于独立节点运行。
至此Hadoop HA集群部署完毕,如有问题欢迎留言交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。