【云驻共创】一文看懂MapReduce和Yarn技术原理
前言
本章主要讲述大数据领域中最著名的批处理与离线处理计算框架—―—MapReduce,包括MapReduce的原理、流程、使用场景,以及Hadoop集群中负责统一的资源管理与调度的组件——Yarn,包括Yarn的定义、功能与架构、HA方案和容错机制,以及利用Yarn完成资源调配的常用方法。最后,我们还简单介绍华为为这些组件所提供的增强特性。
一、MapReduce和Yarn基本介绍
MapReduce概述
MapReduce基于Google发布的MapReduce论文设计开发,基于分而治之的思想,用于大规模数据集(大于1TB) 的并行计算和离线计算,具有如下特点:
- 高度抽象的编程思想:程序员仅需描述做什么,具体怎么做交由系统的执行框架处理。
- 良好的扩展性:可通过添加节点以扩展集群能力。
- 高容错性:通过计算迁移或数据迁移等策略提高集群的可用性与容错性。
资源调度与分配
在Hadoop1.0版本中,只有HDFS和MapReduce, 而资源调度通过MRv1来进行,存在着很多缺陷:
- master是单点, 故障恢复依赖于周期性的checkpoint,不保证可靠性,发生故障的时候会通知用户,由用户自行决定是否重新计算。
- 没有区分作业调度与资源调度。MR在运行时,环境会有大量的Job并发,因此多样且高效的调度策略是非常重要的。
- 没有提到资源隔离与安全性,大量Job并发的时候,如何保证单个Job不占用过多的资源,如何保证用户的程序对系统而言是安全的,在Hadoop 1.0中是个大问题。
因此,针对Hadoop1.0中MRv1的不足,以及为了满足编程范式多样化的需求,Hadoop2.0中正式引入了Yarn框架,以便更好地完成集群的资源调度与分配。
Yarn概述
Apache Hadoop YARN (Yet Another Resource Negotiator), 中文名为“另一 种资源协调者"。它是一一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统- -的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
引入了Yarn之后,它可以支持了多种计算模式,比如说离线计算、实时计算以及迭代计算。
二、MapReduce和Yarn功能与架构
MapReduce过程
顾名思义,MapReduce计算过程可具体分为两个阶段,Map阶段和Reduce阶段。其中,Map阶段输出的结果就是Reduce阶段的输入。
可以把MapReduce理解为, 把一堆杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果
Map面对的是杂乱无章的互不相关的数据,它解析每个数据,从中提取出key和value.也就是提取了数据的特征。
到了Reduce阶段, 数据是以key后而跟着若干个value来组织的, 这些value有相关性。在此基础上我们可以做进一步的处理以便得到结果。
输入是hdfs的一个文件,对这个大的文件按照某种规则可以划分成若干个分片。这里的这个分片跟我们hdfs的block文件,block的大小是有区别的,一般情况下默认一个分片的大小跟一个block的大小它是相等的。但是如果说我们用户自定义会有区别,一般情况下我们有多少个分片就会来产生多少个map任务。在map和reduce中间,实际上有另外一个操作叫shuffle操作。这个shuffle操作中文翻译成洗牌。实际上在MapReduce中,并不是把数据洗的没有规律,而是把数据洗得有规律。然后这个经过了就是分区和有序的数据再传给reduce分别进行了处理,最后得到输出结果。可以发现map它的任务的个数跟分片的个数相等,而request的个数跟其他的一些设置有关系。
Map阶段详解
Job提交前,先将待处理的文件进行分片(Split)。MR框架默认将一 个块(Block) 作为一个分片。客户端应用可以重定义块与分片的映射关系。
Map阶段先把数据放入一个环形内存缓冲区,当缓冲区数据达到80%左右时发生溢写(Spill),需将缓冲区中的数据写入到本地磁盘。
Reduce阶段详解
前面提到的MOF文件是经过排序处理的。当Reduce Task接收的数据量不大时,则直接存放在内存缓冲区中,随着缓冲区文件的增多,MR后台线程将它们合并成一个更大的有序文件,这个动作是Reduce阶段的Merge操作,过程中会产生许多中间文件,最后一次合并的结果直接输出到用户自定义的reduce函数。
当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce。
Shuffle过程详解
Shuffle的定义: Map阶段和Reduce阶段之间传递中间数据的过程,包括ReduceTask从各个Map Task获取MOF文件的过程,以及对MOF的排序与合并处理
shuffle的本意是洗牌、混洗的意思,把一组有规则的数据尽量打乱成无规则的数据。而在MapReduce中,shuffle更像是洗牌的逆过程,指的是将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理。其在MapReduce中所处的工作阶段是map输出后到reduce接收前,具体可以分为map端和reduce端前后两个部分。在shuffle之前,也就是在map阶段,MapReduce会对要处理的数据进行分片(split)操作,为每一个分片分配一个MapTask任务。接下来map()函数会对每一个分片中的每一行数据进行处理得到键值对(key,value),其中key为偏移量,value为一行的内容。此时得到的键值对又叫做“中间结果”。此后便进入shuffle阶段,由此可以看出shuffle阶段的作用是处理“中间结果”。
Word Count 顾名思义就是对单词进行计数,首先会对文件中的单词做统计计数,然后输出出现次数最多的 单词。
单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World",该程序的完整代码可以在Hadoop安装包的"src/examples"目录下找到。单词计数主要完成功能是:统计一系列文本文件中每个单词出现的次数
分别通过map和reduce方法统计文本中每个单词出现的次数,然后按照字母的顺序排列输出,Map过程首先是多个map并行提取多个句子里面的单词然后分别列出来每个单词,出现次数为1,全部列举出来。
Reduce过程首先将相同key的数据进行查找分组然后合并,比如对于key为Hello的数据分组为:<Hello, 1>、<Hello,1>、<Hello,1>,合并之后就是<Hello,1+1+1>,分组也可以理解为reduce的操作,合并减少数据时reduce的主要任务,叠加运算之后就是<Hello, 3>所以最后可以输出Hello 3,这样就完成了一轮MapReduce处理。
Yarn的组件架构
Yarn 从整体上还是属于 master/slave 模型,主要依赖于三个组件来实现功能,第一个就是 ResourceManager,是集群资源的仲裁者,它包括两部分:一个是可插拔式的调度 Scheduler,一个是 ApplicationManager,用于管理集群中的用户作业。第二个是每个节点上的 NodeManager,管理该节点上的用户作业和工作流,也会不断发送自己 Container 使用情况给 ResourceManager。第三个组件是 ApplicationMaster,用户作业生命周期的管理者它的主要功能就是向 ResourceManager(全局的)申请计算资源(Containers)并且和 NodeManager 交互来执行和监控具体的 task。
MapReduce On Yarn任务调度流程
1、客户端请求提交一个MR任务
2、resourcemanger返回提交程序资源的路径
3、yarn客户端提交job资源
4、通知MR提交完毕
5、resourcemanger将请求封装成task
6、启动MR的AppMaster
7、AppMaster申请资源启动nodemanager
在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。
Yarn HA方案
Yarn中的ResourceManager负责整个集群的资源管理和任务调度,Yarn高可用性方案通过引入冗余的ResourceManager节点的方式,解决了ResourceManager单点故障问题。
Yarn AppMaster容错机制
当resourcemanger接收到客户端的发送的任务执行请求之后,他会为这个任务去分配ApplicationMaster,而ApplicationMaster主要是负责后续的任务的监控与调度,但是ApplicationMaster在节点上去运行不一定会成功。当失败的时候怎么办?它会在其他的节点上另外启动一个容器,然后让新的ApplicationMaster进行运行。
三、Yarn的资源管理和任务调度
资源管理
每个NodeManager可分配的内存和CPU的数量可以通过配置选项设置(可在Yarn服务配置页面配置)。
yarn.nodemanager.resource .memory mb:可以分配给容器的物理内存的大小
yarn.nodemanager.vmem pmem ratio:虚拟内存跟物理内存的比值
yarn.nodemanager.resource.pu vcore: 可分配给容器的CPU核数
在Hadoop3.x版本中, YARN资源模型已被推广为支持用户自定义的可数资源类型(support user -defined countable resource types ),而不是仅仅支持CPU和内存。
常见的可数资源类型,除了CPU和Memory以外,还包括GPU资源、软件licenses或本 地附加存储器( lcally atached storage)之类的资源,但不包括端口(Ports) 和标签(Labels)。
YARN的三种资源调度器
在Yarn中, 负责给应用分配资源的叫做Scheduler (调度器)。在YARN中,根据不同的策略,共有三种调度器可供选择:
- FIFO Scheduler:把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
- Capacity Scheduler: 允许多个组织共享整个集群,每个组织可以获得集群的-部分计算能力。通过为每个组织分配专门]的队列,然后再为每个队列分配-一定的集群资源,通过设置多个队列的方式给多个组织提供服务。除此之外,队列内部又可以垂直划分,这样-个组织内部的多个成员就可以共享这个队列资源了。在-一个队列内部,资源的调度是采用的是FIFO策略。
- Fair Scheduler:为所有的应用分配公平的资源(对公平的定义可以通过参数来设置)。
容量调度器的介绍
- 容量调度器使得Hadoop应用能够共享的、多用户的、操作简便的运行在集群上,同时最大化集群的吞吐量和利用率。
- 容量调度器以队列为单位划分资源,每个队列都有资源使用的下限和.上限。每个用户可以设定资源使用上限。管理员可以约束单个队列、用户或作业的资源使用。支持作业优先级,但不支持资源抢占。
- 在Hadoop 3.x中,OrgQueue 扩展了容量调度器,通过REST API提供了以编程的方式来改变队列的配置。这样,管理员可以在队列的administer_ _queue ACL中自动进行队列配置管理。
资源分配模型
●调度器维护一群队列的信息。用户可以向一个或者多个队列提交应用。
●每次NM心跳的时候,调度器根据一定的规则选择一一个队列, 再在队列上选择一个应用,尝试在这个应用上分配资源。
●调度器会优先匹配本地资源的申请请求,其次是同机架的,最后是任意机器的。
在YARN的资源分配过程中,其采用了双层资源调度模型:
在第一层中,ResourceManager中的资源调度器将资源分配给各个ApplicationMaster;
在第二层中,ApplicationMaster再进一步将资源分配给它内部的各个任务;
YARN的资源分配过程是异步的,也就是说,资源调度器将资源分配给一个应用程序后,它不会立刻push给对应的ApplicationMaster,而是暂时放到一个缓冲区中,等待ApplicationMaster通过周期性的心跳主动来取(pull-based通信模型)
YARN采用了增量资源分配机制(当应用程序申请的资源暂时无法保证时,为应用程序预留一个节点上的资源直到累计释放的空闲资源满足应用程序需求),这种机制会造成浪费,但不会出现饿死现象;
YARN资源调度器采用了主资源公平调度算法,DRF的基本设计思想则是将最大最小化公平算法应用于主资源上,进而将多维资源调度问题转化为单资源调度问题,即DRF总是最大化所有主资源中最小的;
四、Yarn增强特性
在华为大数据平台中它支持动态内存管理。对于container,在原始的Yarn版本中呢,如果说一个computer它使用内存的容量超过了container所设定的内存容量阈值,这时候呢这个作业就会失败。为了去降低这个作业失败的这个几率,我们的华为大数据采用了一种的动态内存管理机制,允许了就是所有的container超过它设定的阈值,只要这个节点中所有的container它的内存的。容量总和不超过了这个节点所设定的内存的阈值,那么它还是会允许这个container继续进行运行,因此减少了做用户作业失败的可能性。
在原始的Yarn资源管理调度平台中,对容器的放置是没有考虑的,比如说有些容器它可能随机的、随机的或者按照某个规律分配到某一个节点上,但是这一个节点有可能它内存空间比较小。内存容量比较有限,因为这这个容器它会占用比较多的内存,因此放置放置到这个节点上,它容易造成了内存的溢出。因此华为大数据平台基于这个原因对Yarn进行了优化,它会让用户队列去绑定的一定的标签,放置到这个用户队列的应用进行了任务调度的时候,就会把相应的任务放置到适合的节点上。比如说一些常规的资源需求的应用,放到了普通的性能的服务器上。比如说一些高内存需求的应用,就放到高内存需求应用这样一个标签队列里面去,他就会分配到了高内存的机器或服务器上去运行这个容器。
总结:
本章首先讲述了MapReduce和Yarn的应用场景和基本架构,然后讲解了Yarn资源管理与任务调度的原理,最后介绍了华为MRS集群中对于Yarn的增强特性。
学习推荐
华为Learning网站: https://support.huawei.com/learning
华为e学云: https://support.huawei.com/learning/elearning
华为Support案例库:https://support.huawei.com/enterprise
本文整理自华为云社区【内容共创系列】活动。
查看活动详情:https://bbs.huaweicloud.com/blogs/314887
相关任务详情:MapReduce和Yarn技术原理
- 点赞
- 收藏
- 关注作者
评论(0)