hadoop-2.7.7 HA完全分布式集群部署详解
1.Hadoop HA简介及工作原理
Hadoop NameNode官方开始支持HA集群默认是从2.0开始,之前的版本均是不支持NameNode HA的高可用的。
1.1 Hadoop HA简介
Hadoop-HA集群运作机制介绍
- HA即高可用(7*24小时不中断服务)
- 实现高可用最关键的是消除单点故障
- 分成各个组件的HA机制——HDFS的HA、YARN的HA
HDFS的HA机制详解
通过双namenode消除单点故障,以下为双namenode协调工作的特点:
A、元数据管理方式需要改变:
- 内存中各自保存一份元数据
- Edits日志只能有一份,只有Active状态的namenode节点可以做写操作
- 两个namenode都可以读取edits
- 共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)
B、需要一个状态管理功能模块
- 实现了一个zkfailover,常驻在每一个namenode所在的节点
- 每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识
- 当需要进行状态切换时,由zkfailover来负责切换
- 切换时需要防止brain split现象的发生
1.2 Hadoop HA工作原理图例
HDFS的HA架构
使用 Active NameNode,Standby NameNode 两个结点解决单点问题,两个结点通过JounalNode 共享状态,采用ZKFC选举Active实时监控集群状态,自动进行故障备援。
- Active NameNode:接受 client 的 RPC 请求并处理,同时写自己的 Editlog 和共享存储上的 Editlog,接收 DataNode 的 Block report, block location updates 和 heartbeat;
- Standby NameNode:同样会接到来自 DataNode 的 Block report, block location updates 和heartbeat,同时会从共享存储的 Editlog 上读取并执行这些 log 操作,使得自己的 NameNode 中的元数据(Namespcae information + Block locations map)都是和 Active NameNode 中的元数据是同步的。所以说 Standby 模式的 NameNode 是一个热备(Hot Standby NameNode),一旦切换成 Active 模式,马上就可以提供 NameNode 服务
- JounalNode:用于Active NameNode , Standby NameNode 同步数据,本身由一组 JounnalNode 结点组成,该组结点基数个,支持 Paxos 协议,保证高可用,是 CDH5 唯一支持的共享方式(相对于 CDH4 促在NFS共享方式)
- ZKFC:监控NameNode进程,自动备援。
YARN的HA架构
ResourceManager HA由一对Active,Standby结点构成,通过RMStateStore 存储内部数据和主要应用的数据及标记。
支持可替代的RMStateStore实现方式如下:
- 基于内存的MemoryRMStateStore
- 基于文件系统的FileSystemRMStateStore
- 基于 zookeeper的ZKRMStateStore
ResourceManager HA 的架构模式同NameNode HA的架构模式基本一致,数据共享由 RMStateStore,而ZKFC成为ResourceManager进程的一个服务,非独立存在。
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.HA环境准备
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的方式实现。
- sre01生成密钥并分发密钥至其它机器:
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
- sre02生成密钥并分发密钥至其它机器:
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
3.zookeeper集群部署
根据规划在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.Hadoop HA集群部署
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.Hadoop HA集群启动及维护,需按照顺序执行。
5.1初始化zookeeper并启动集群
- 启动zookeeper节点:sre03、sre04、sre05分别执行
zkServer.sh start
- 格式化zookeeper节点:sre01执行
hdfs zkfc -formatZK
5.2初始化hadoop并启动集群
- 启动journalnode节点:sre03、sre04、sre05分别执行
hadoop-daemon.sh start journalnode
- 格式化namenode:sre01上执行
hdfs namenode -format
- 启动datanode节点:sre03、sre04、sre05分别执行
hdfs namenode -format
- 启动namenode节点sre01
hadoop-daemon.sh start namenode
- 启动namenode节点sre02
hdfs namenode -bootstrapStandby hadoop-daemon.sh start namenode
此时sre01和sre02均处于standby状态。
- 启动zkfc服务:sre01、sre02分别执行
hadoop-daemon.sh start zkfc
-
健康状态检查:运行状态说明。
- 启动zkfc服务后,sre01和sre02会自动选举出active节点。
- 此时一个节点为active状态,另一个处于standby状态。
5.3 HA故障自动切换测试
**集群健康状态下,默认sre01为active状态,sre02为standby状态。
现在模拟sre01节点故障,将sre01服务终止测试sre02是否自动切换为active状态。**
- sre01节点执行:
jps 16415 DFSZKFailoverController 14213 Jps 15626 NameNode kill -9 15626
- sre02状态查看:
此时sre02由standby状态自动切换到active状态,HA故障自动切换测试成功。
注意:生成环境中由于ResourceManager消耗资源过多,建议是单独部署于独立节点运行。
至此Hadoop HA集群部署完毕,如有问题欢迎留言交流。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开发函数计算的正确姿势 —— Fun validate 语法校验排错指南 | 5月22日云栖夜读
点击订阅云栖夜读日刊,专业的技术干货,不容错过! 阿里专家原创好文 1.开发函数计算的正确姿势 —— Fun validate 语法校验排错指南 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。阅读更多》》 2.从HelloWorld看Knative Serving代码实现 本文讲述:Knative Serving以Kubernetes和Istio为基础,支持无服务器应用程序和函数的部署并提供服务。我们从部署一个HelloWorld示例入手来分析Knative Serving的代码细节。阅读更多》》 3.在加州最古老的监狱教课是种什么样的体验? 彼得·斯登(Peter Stern)是阿里巴巴战略投资部的一名洋小二,是办公室出了名的“空中飞人”。斯登一年中大部分时间都在各大洲飞来飞去——但无论多忙,每个月他都会去圣昆丁监狱上课。阅读更多》》 4.阿里五年晋升三次,这个程序员要聊聊他的选择 小二穆远是蚂蚁金服的一名程序员,五年晋升了三次,他要聊聊自己的五...
- 下一篇
TalkingData的Spark On Kubernetes实践 | 5月23日云栖夜读
点击订阅云栖夜读日刊,专业的技术干货,不容错过! 阿里专家原创好文 1.TalkingData的Spark On Kubernetes实践 本文整理自talkingdata云架构师徐蓓的分享,介绍了Spark On Kubernetes在TalkingData的实践。阅读更多》》 2.IP应用加速技术详解:如何提升动静混合站点的访问速率? 本文讲述:K全站加速(DCDN)-IPA是阿里云自主研发四层加速产品,它基于TCP/UDP的私有协议提供加速服务,包括解决跨运营商网络不稳定、单线源站、突发流量、网络拥塞等诸多因素导致的延迟高、服务不稳定的问题,提升传输性能和用户体验。阅读更多》》 3.阿里技术男的成长史:越想证明自己死得越快…… 要不要折腾一下?2008年5月的一天钱磊对新婚的妻子说,想去杭州发展,那里有个公司叫阿里巴巴……一篇精彩好文,值得一读!阅读更多》》 4.对话亲历者|鲁肃:我在支付宝“拧螺丝“的日子 他是支付宝技术平台的奠基人之一,但是他总说“这还不是我心中最完美的架构”;他行事低调但却有着“此时此地,非我莫属”的豪气;他曾无数次充当救火大队长,但自评只是“没有掉队的那个...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装