hadoop高可用安装和原理详解
发布日期:2021-05-09 09:32:56 浏览次数:10 分类:博客文章

本文共 13377 字,大约阅读时间需要 44 分钟。

本篇主要从hdfs的namenode和resourcemanager的高可用进行安装和原理的阐述。

一、HA安装

1、基本环境准备

1.1.1、centos7虚拟机安装,详情见

1.1.2、关闭防火墙

systemctl stop firewalld.servicesystemctl disable firewalld.service

1.1.3、修改selinux

vim /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled

[hadoop@lgh2 ~]$ cat /etc/selinux/config# This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:#     enforcing - SELinux security policy is enforced.#     permissive - SELinux prints warnings instead of enforcing.#     disabled - No SELinux policy is loaded.SELINUX=disabled# SELINUXTYPE= can take one of three two values:#     targeted - Targeted processes are protected,#     minimum - Modification of targeted policy. Only selected processes are protected. #     mls - Multi Level Security protection.SELINUXTYPE=targeted

1.1.4、安装java

java 安装tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/local/vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.8.0_201 export JRE_HOME=/usr/local/jdk1.8.0_201/jre     export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/libexport PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH source /etc/profile

1.1.5、添加用户hadoop

groupadd hadoopuseradd -g hadoop -d /home/hadoopecho 'hadoop' | passwd hadoop --stdin

1.1.6、修改/etc/hosts

cat /etc/hosts192.168.88.131 lgh1192.168.88.132 lgh2192.168.88.133 lgh3

如上环境我们准备三台机器,如上1.1.6所见:

1.1.7、配置免密登录

ssh-keygen -t rsa #这个操作需要连续三次按enter键,ssh-copy-id  lgh3ssh-copy-id  lgh2ssh-copy-id  lgh1

1.1.8、配置时间同步(这个很重要,在生产环境必定要有,不过自己玩也可以不用配置)

首先我们选定192.168.88.131(lgh1)这台为时间标准的节点,其他两台机器同这个节点进行同步

设置192.168.88.131这个节点:

yum install -y ntp  #如果没有安装就安装[root@lgh1 ~]# rpm -qa | grep ntp  #查看安装结果ntp-4.2.6p5-29.el7.centos.x86_64   #用来提供时间同步服务ntpdate-4.2.6p5-29.el7.centos.x86_64 #和某台服务器进行同步

修改/etc/ntp.conf文件

egrep -v "^$|#" /etc/ntp.conf[root@lgh1 ~]# egrep -v "^$|#" /etc/ntp.conf driftfile /var/lib/ntp/driftrestrict default nomodify notrap nopeer noqueryrestrict 192.168.88.0 mask 255.255.255.0 nomodify notrap restrict 127.0.0.1 restrict ::1#server 0.centos.pool.ntp.org iburst#server 1.centos.pool.ntp.org iburst#server 2.centos.pool.ntp.org iburst#server 3.centos.pool.ntp.org iburstserver 127.127.1.0fudge 127.127.1.0 stratum 10includefile /etc/ntp/crypto/pwkeys /etc/ntp/keysdisable monitor

systemctl enable ntpd  #启动

其他两个节点:lhg2和lgh3设置如下:

首先要安装ntpd:yum install -y ntp #如果没有安装则要安装
新增crontab -e */5 * * * * /usr/sbin/ntpdate -u 192.168.88.131 #表示每五分钟和131时间同步一次

测试:(可以通过如下命令修改131的时间,看其他两个节点是否能同步成功,亲测成功)

date "+%Y-%m-%d %H:%M:%S"
date -s '2018-09-20 10:02:02'

 

2、hadoop高可用安装

1.2.1、安装规划--目录

 

mkdir -p /opt/hadoop #存放hadoop文件,安装目录chown -R hadoop:hadoop /opt/hadoopmkdir -p /opt/data/hadoop/hdfs #存放namenode和datanode的数据mkdir -p /opt/data/hadoop/tmp  #存放临时文件chown -R hadoop:hadoop /opt/data/hadoop/hdfschown -R hadoop:hadoop /opt/data/hadoop/tmp

 

1.2.2、角色规划

 

  解压1.2.3、zookeeper安装

cd /opt/hadooptar -zxvf zookeeper-3.4.8.tar.gz ln -s  zookeeper-3.4.8 zookeeper

配置环境变量

vim /etc/profileexport ZOOKEEPER_HOME=/opt/hadoop/zookeeperexport PATH=$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$PATHsource /etc/profile

修改配置zoo.cfg

cd /opt/hadoop/zookeeper/confcp zoo_sample.cfg zoo.cfgvim zoo.cfgtickTime=2000 #服务器与客户端之间交互的基本时间单元(ms)initLimit=10 # 此配置表示允许follower连接并同步到leader的初始化时间,它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则连接失败syncLimit=5 # Leader服务器与follower服务器之间信息同步允许的最大时间间隔,如果超过次间隔,默认follower服务器与leader服务器之间断开链接dataDir=/opt/hadoop/zookeeper/data #保存zookeeper数据路径dataLogDir=/opt/hadoop/zookeeper/dataLog #保存zookeeper日志路径,当此配置不存在时默认路径与dataDir一致clientPort=2181 #客户端访问zookeeper时经过服务器端时的端口号server.1=lgh1:2888:3888 #表示了不同的zookeeper服务器的自身标识,作为集群的一部分,每一台服务器应该知道其他服务器的信息server.2=lgh2:2888:3888server.3=lgh3:2888:3888maxClientCnxns=60 #限制连接到zookeeper服务器客户端的数量

修改myid文件

cd /opt/hadoop/zookeepermkdir data dataLogcd /opt/hadoop/zookeeper/datatouch myid && echo 1 > myid

分发并修改myid文件

scp -r /opt/hadoop/zookeeper hadoop@lgh2:/opt/hadoop/scp -r /opt/hadoop/zookeeper hadoop@lgh3:/opt/hadoop/
vim /opt/hadoop/zookeeper/data/myid #lgh2 修改为2vim /opt/hadoop/zookeeper/data/myid #lgh3 修改为3

启动并查看状态

zkServer.sh startzkServer.sh status

一台为leader状态,其他两个为follower状态

 

 

 

 1.2.4、解压hadoop

cd /opt/hadooptar -zxvf hadoop-2.7.7.tar.gz ln -s hadoop-2.7.7 hadoop

1.2.5、配置环境变量

export HADOOP_HOME="/opt/hadoop/hadoop-2.7.7"export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

1.2.6、修改hadoop-env.sh、mapred-env.sh、yarn-env.sh

export JAVA_HOME=/usr/local/jdk1.8.0_201

1.2.7、修改hdfs-site.xml文件

dfs.nameservices
mycluster
dfs.ha.namenodes.mycluster
nn1,nn2
dfs.namenode.rpc-address.mycluster.nn1
lgh1:8020
dfs.namenode.rpc-address.mycluster.nn2
lgh2:8020
dfs.namenode.http-address.mycluster.nn1
lgh1:50070
dfs.namenode.http-address.mycluster.nn2
lgh2:50070
dfs.namenode.shared.edits.dir
qjournal://lgh1:8485;lgh2:8485;lgh3:8485/mycluster
dfs.journalnode.edits.dir
/opt/hadoop/hadoop/tmp/data/dfs/jn
dfs.client.failover.proxy.provider.mycluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence shell(/bin/true)
dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa
dfs.qjournal.start-segment.timeout.ms
60000
dfs.replication
2
dfs.namenode.name.dir
/opt/data/hadoop/hdfs/nn
dfs.datanode.data.dir
/opt/data/hadoop/hdfs/dn
dfs.ha.automatic-failover.enabled
true
dfs.webhdfs.enabled
true
dfs.ha.fencing.ssh.connect-timeout
30000
ha.failover-controller.cli-check.rpc-timeout.ms
60000

1.2.8、修改core-site.xml

fs.defaultFS
hdfs://mycluster
hadoop.tmp.dir
/opt/data/hadoop/tmp
ha.zookeeper.quorum
lgh1:2181,lgh2:2181,lgh3:2181
ha.zookeeper.session-timeout.ms
30000
ms
fs.trash.interval
1440
hadoop.proxyuser.hdfs.groups
*
hadoop.proxyuser.hdfs.hosts
*
hadoop.proxyuser.hive.groups
*
hadoop.proxyuser.hive.hosts
*

1.2.9、修改yarn-site.xml 

yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.log-aggregation-enable
true
yarn.log-aggregation.retain-seconds
106800
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
yarn-cluster
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
lgh2
yarn.resourcemanager.hostname.rm2
lgh3
yarn.resourcemanager.zk-address
lgh1:2181,lgh2:2181,lgh3:2181
yarn.resourcemanager.recovery.enabled
true
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
yarn.log.server.url
http://lgh2:19888/jobhistory/logs/

1.2.10、修改 slaves 

lgh1lgh2lgh3

1.2.11、分发到其他两个节点

scp /opt/hadoop/hadoop-2.7.7 hadoop@lgh2:/opt/hadoop/scp /opt/hadoop/hadoop-2.7.7 hadoop@lgh3:/opt/hadoop/

1.2.12、格式化nomenode和zookeeper

[hadoop@lgh1 ~]$ hdfs namenode -format[hadoop@lgh2 ~]$ hdfs namenode -bootstrapStandby
[hadoop@lgh1 ~]$ hdfs zkfc -formatZK #格式化zookeeper

1.2.13、启动

stop-dfs.sh  #关闭所有journalnodestart-dfs.sh #启动namenode,datanode,journalnode等组件start-yarn.sh #启动yarn[hadoop@lgh2 ~]$ /opt/hadoop/hadoop/sbin/yarn-daemon.sh start resourcemanager #这里一定要注意是yarn-daemon.sh,启动resourcemanager[hadoop@lgh3 ~]$ /opt/hadoop/hadoop/sbin/yarn-daemon.sh start resourcemanager

1.2.14、查看进程

jps (图片不协调。。。)

 

 

 

1.2.15、 访问页面(namenode)

192.168.88.131:50070

192.168.88.132:50070

 

 

 

 

 

1.2.16、测试namenode故障转移

在节点192.168.88.132上执行:

[hadoop@lgh2 ~]$ /opt/hadoop/hadoop/sbin/hadoop-daemon.sh stop namenode

 

 

 

 

 

 

 然后我们恢复192.168.88.132的namenode

[hadoop@lgh2 ~]$ /opt/hadoop/hadoop/sbin/hadoop-daemon.sh start namenode

 

 

 该节点变成了standby节点。说明故障转移成功

1.2.17、查看yarn页面访问

 

 

resourcemanager的故障测试:

[hadoop@lgh3 ~]$ /opt/hadoop/hadoop/sbin/yarn-daemon.sh stop resourcemanager  #停掉lgh3节点上的resourcemanager

这里不截图了,很成功

到这里hadoop的高可用就安装完毕了(不过笔者这个中踩了不少坑,遇到一些奇葩问题,但是没有记录,总之,删除掉生成的东西,多格式化几次试试)

删除的目录有:

rm -rf /opt/data/hadoop/hdfs/*

rm -rf /opt/data/hadoop/tmp/*

rm -rf /opt/hadoop/hadoop/logs/*

 

 

二、基本原理

1、namenode高可用

 

     我们知道namenode是整个hdfs的核心,如果namenode挂了,那么整个hdfs文件系统也不能提供服务,所以hadoop对hdfs提供了高可用的方案,即Hadoop HA,hdfs的高可用提供了两种方案,一种是基于QJM(Quorum Journal Manager)的,一种是基于NFS的,我们用的一般都是基于QJM的,所以这里也是讲基于QJM的高可用,高可用用来解决NameNode单点故障的问题。解决的方法是在HDFS集群中设置多个NameNode节点。那么提供多个namenode必定存在新的问题:

1、如何保证NameNode内存中元数据数据一致,并保证编辑日志文件的安全性。

2、多个NameNode如何协作
3、客户端如何能正确地访问到可用的那个NameNode。
4、怎么保证任意时刻只能有一个NameNode处于对外服务状态

针对如上问题,hadoop提供了如下解决方案:

       对于保证NameNode元数据的一致性和编辑日志的安全性,采用Zookeeper来存储编辑日志文件。

       两个NameNode一个是Active状态的,一个是Standby状态的,一个时间点只能有一个Active状态的 。

       NameNode提供服务,两个NameNode上存储的元数据是实时同步的,当Active的NameNode出现问题时,通过Zookeeper实时切换到Standby的NameNode上,并将Standby改为Active状态。

      客户端通过连接一个Zookeeper的代理来确定当时哪个NameNode处于服务状态。

我们看一下hdfs高可用的架构图:如下图所示:

 

 

          HDFS HA架构中有两台NameNode节点,一台是处于活动状态(Active)为客户端提供服务,另外一台处于热备份状态(Standby)。

         DataNode会将心跳信息和Block汇报信息同时发给两台NameNode,DataNode只接受Active NameNode发来的文件读写操作指令。为了使备用节点保持其状态与Active节点同步,两个节点都与一组称为“JournalNodes”(JN)的单独守护进程通信。当Active节点执行任何名称空间修改时,它会将修改记录持久地记录到大多数这些JN中。待机节点能够从JN读取编辑,并且不断观察它们对编辑日志的更改。当备用节点看到编辑时,它会将它们应用到自己的命名空间。如果发生故障转移,Standby将确保在将自身升级为Active状态之前已从JournalNodes读取所有编辑内容。这可确保在发生故障转移之前完全同步命名空间状态。注意:必须至少有3个JournalNode守护进程,因为编辑日志修改必须写入大多数JN。这将允许系统容忍单个机器的故障。您也可以运行3个以上的JournalNodes,但为了实际增加系统可以容忍的失败次数,您应该运行奇数个JN(即3,5,7等)。请注意:当使用N JournalNodes运行时,系统最多可以容忍(N-1)/ 2个故障并继续正常运行。

     Zookeeper来保证在Active NameNode失效时及时将Standby NameNode修改为Active状态。

   故障检测 - 集群中的每个NameNode计算机都在ZooKeeper中维护一个持久会话。如果计算机崩溃,ZooKeeper会话将过期,通知其他NameNode应该触发故障转移。Active NameNode选举 - ZooKeeper提供了一种简单的机制,可以将节点专门选为活动节点。如果当前活动的NameNode崩溃,则另一个节点可能在ZooKeeper中采用特殊的独占锁,指示它应该成为下一个活动的。

    ZKFailoverController(ZKFC)是一个新组件,它是一个ZooKeeper客户端,它还监视和管理NameNode的状态。运行NameNode的每台机器也运行ZKFC,ZKFC负责:

1、运行状况监视 : ZKFC定期使用运行状况检查命令对其本地NameNode进行ping操作。只要NameNode及时响应健康状态,ZKFC就认为该节点是健康的。如果节点已崩溃,冻结或以其他方式进入不健康状态,则运行状况监视器会将其标记为运行状况不佳。

2、ZooKeeper会话管理 :当本地NameNode运行正常时,ZKFC在ZooKeeper中保持会话打开。如果本地NameNode处于活动状态,它还拥有一个特殊的“锁定”znode。此锁使用ZooKeeper对“短暂”节点的支持; 如果会话过期,将自动删除锁定节点

3、基于ZooKeeper的选举 :如果本地NameNode是健康的,并且ZKFC发现没有其他节点当前持有锁znode,它将自己尝试获取锁。如果成功,那么它“赢得了选举”,并负责运行故障转移以使其本地NameNode处于活动状态。故障转移过程类似于上述手动故障转移:首先,必要时对先前的活动进行隔离,然后本地NameNode转换为活动状态。

    元数据文件有两个文件:fsimage和edits,备份元数据就是备份这两个文件。JournalNode用来实时从Active NameNode上拷贝edits文件,JournalNode有三台也是为了实现高可用。

    Standby NameNode不对外提供元数据的访问,它从Active NameNode上拷贝fsimage文件,从JournalNode上拷贝edits文件,然后负责合并fsimage和edits文件,相当于SecondaryNameNode的作用。最终目的是保证Standby NameNode上的元数据信息和Active NameNode上的元数据信息一致,以实现热备份。

 

2、resourcemanager高可用

首先我们来看一下官方提供的架构图:如图所示:

 

 

    ResourceManager HA通过主动/备用架构实现 - 在任何时间点,其中一个RM处于活动状态,并且一个或多个RM处于待机模式,等待活动RM出现故障或者宕机时机。转换为活动的触发器来自管理员(通过CLI)或启用自动故障转移时的集成故障转移控制器。

   RM可以选择嵌入基于Zookeeper的ActiveStandbyElector来决定哪个RM应该是Active。当Active关闭或无响应时,另一个RM自动被选为Active,然后接管。请注意,不需要像HDFS那样运行单独的ZKFC守护程序,因为嵌入在RM中的ActiveStandbyElector充当故障检测器和领导者选择器而不是单独的ZKFC守护程序。

    当存在多个RM时,客户端和节点使用的配置(yarn-site.xml)应该列出所有RM。客户端,应用程序管理器ApplicationMaster(AM)和节点管理器NodeManager(NM)尝试以循环方式连接到RM,直到它们到达活动RM。如果活动停止,他们将恢复循环轮询,直到他们连接到新的RM

 

更多相关文章:

参考:

转载地址:https://www.cnblogs.com/zsql/p/11560372.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:hadoop生态系列
下一篇:mysql事务

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月29日 22时13分16秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

带你玩转属于自己的spring-boot-starter系列(三) 2021-06-30
基于SnowFlake算法如何让分库分表中不同的ID落在同一个库的算法的实现 2021-06-30
基于springboot的ShardingSphere5.X的分库分表的解决方案之分库解决方案(二) 2021-06-30
基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一) 2021-06-30
基于springboot的ShardingSphere5.X的分库分表的解决方案之关联查询解决方案(三) 2021-06-30
基于springboot的ShardingSphere5.X的分库分表的解决方案之基于seata的分布式事务的解决方案(十五) 2021-06-30
Linux文件管理参考 2021-06-30
FTP文件管理项目(本地云)项目日报(一) 2021-06-30
FTP文件管理项目(本地云)项目日报(二) 2021-06-30
FTP文件管理项目(本地云)项目日报(三) 2021-06-30
FTP文件管理项目(本地云)项目日报(四) 2021-06-30
【C++】勉强能看的线程池详解 2021-06-30
FTP文件管理项目(本地云)项目日报(五) 2021-06-30
FTP文件管理项目(本地云)项目日报(关于不定长包的测试) 2021-06-30
FTP文件管理项目(本地云)项目日报(六) 2021-06-30
FTP文件管理项目(本地云)项目日报(七) 2021-06-30
FTP文件管理项目(本地云)项目日报(八) 2021-06-30
【Linux】血泪教训 -- 动态链接库配置方法 2021-06-30
FTP文件管理项目(本地云)项目日报(九) 2021-06-30
以练代学设计模式 -- FTP文件管理项目 2021-06-30