5 MapReduce和Yarn
摘要:本文中主要讲述大数据领域中最著名的批处理和离线处理计算框架——MapReduce,包括MapReduce的原理、流程、使用场景,以及Hadoop集群中负责统一的资源管理和调度的组件——Yarn。作者:来自ArimaMisaki创作
5.1 基本介绍
5.1.1 MapReduce概述
说明:MapReduce基于Google发布的MapReduce论文设计开发,基于分而治之的思想,用于大规模数据集的并行计算和离线计算,具有如下特点:
- 高度抽象的编程思想:程序员仅需要描述做什么,具体怎么做交由系统的执行框架处理。
- 良好的扩展性:可通过添加节点以扩展集群能力。
- 高容错性:通过计算迁移或数据迁移等策略提高集群的可用性和容错性。
5.1.2 资源调度与分配
说明:在Hadoop1.0版本中,只有HDFS和MapReduce,而资源调度通过MRv1(即MapReduce1.x版本)来进行,因此存在很多缺陷。
缺点:
- master是单点,故障恢复依赖于周期性地checkpoint,不保证可靠性;发生故障的时候会通知客户,由用户自行决定是否重新计算。
- 没有区分作业调度与资源调度;MR在运行时,环境会有大量的Job并发,因此多样而高效地调度策略是非常重要的。
- 没有提到资源隔离和安全性;大量Job并发的时候,如何实现负载均衡以保证单个Job不占用过多的资源,如何保证用户的程序对系统而言是安全的,在Hadoop1.0中是个大问题。
yarn的出现:针对以上的缺点以及满足编程范式多样化的需求,Hadoop2.x版本中正式引入了Yarn框架,以便更好地完成集群的资源调度和分配。
5.1.3 Yarn概述
说明:Apache Hadoop YARN(Yet Another Resource Negotiator),中文名为另一种资源协调者。它是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源和调度,它的引入为集群在利用率、资源统一管理和数据共享层面带来了巨大好处。
5.2 MapReduce和Yarn的架构
5.2.1 MapReduce过程
说明:MapReduce计算的过程可以分为两个阶段:Map阶段和Reduce阶段。其中,Map阶段输出的结果就是Reduce阶段的输入。我们可以把MapReduce简单地理解为将一堆杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果。
Map面对的是杂乱无章的互不相关的数据,其解析每个输出,并从中提取出key:value即数据的特征。
Reduce阶段接收Map阶段的数据,且该阶段的数据是以key后面跟着若干个value来阻组织的,这些value具有相关性,在此基础上我们可以作进一步的处理以便得到结果。
5.2.2 MapReduce工作流程
说明:通常我们将一个文件中的数据分为若干个切片(Split),有多少个Split就会有多少个Map任务,Map任务和Reduce任务之间存在洗牌(Shuffle),他们将Map分好的key:value整理有序并分区,然后传递给Reduce任务,通过Reduce任务输出最终结果。
5.2.3 Map阶段详解
说明:我们将一个传递给MapReduce处理的文件数据成为Job。Job提交前,先将待处理的文件进行分片,MR框架默认将一个块作为一个分片,客户端应用可以重定义块和分片的映射关系。
Map阶段先把数据放入一个环形内容缓冲区,缓冲区的数据溢出即可进入后续处理阶段,我们将这个过程称为溢写
;溢写的比例一般是80%左右,当达到溢写比例时,需要将缓冲区的数据全部写入本地磁盘。
溢写后并不是直接将数据写入本地磁盘,这是需要经过Map Phase(Map Shuffle)过程,这实际上是一个冗长的过程,其中细化可以分为分区
、排序
、合并
、归并
。
5.2.4 Reduce阶段详解
说明:通过Map阶段输出的数据文件我们称为MOF(MapOutFile)。MOF文件经过排序处理。当Reduce Task接收的数据量不大时,则直接存放内存缓冲区中,随着缓冲区文件的增多,MR后台线程将它们合并成一个更大的有序文件,这个动作时Reduce阶段的Merge操作,过程中会产生许多中间文件,最后一次合并的结果直接输出到用户自定义的reduce函数。
当数据很少时,我们在Map阶段可能不会达到溢写比例。这时候数据会在缓存中归并,然后输出给Reduce。
5.2.5 Shuffle过程详解
说明:Map阶段和Reduce阶段之间传递中间数据的过程成为Shuffle。这在前面学习过程中已经提及。这个过程包括ReduceTask从各个MapTask获取MOF我呢间的过程,以及对MOF的培训和合并处理。
过程详解:从输入开始即为Map任务的启动;将Job任务提交给Map,Map会将一整个任务分为许多个键值对,此后将这些键值对数据传入环形缓存区中,溢写的数据进入MapShuffle过程;在这个过程中,我们将键值对进行整理,主要的整理过程为分区、排序和合并。集中合并不是必须的,合并过程我们可以举例:如<”a”,1>,<”a”,1>变为<”a”,2>的过程;通过归并可以将数据分区;进行分区后的数据经由reduce取走,在reduce端再次做一次归并,然后合并为一个文件进行输出。
5.2.6 Yarn组件架构
说明:以下是MR1.0的架构图,在当时,主要工作都是由JobTracker负责,造成任务繁多。
说明:在MR2.0后,Yarn分离了出来,并且使用ResourceManager分担了JobTracker的部分工作,而任务调度主要则交由ApplicationMaster来承担。
5.2.7 MR on Yarn任务调度流程
过程:
- Client将应用程序和ApplicationsManager提交给ResourceManager
- ResourceManager接收到任务之后对其进行资源分配
- ResourceManager利用ApplicationsManager进行资源调度
- ApplicationsManager试图询问每一个Node上面的NodeManager哪个资源较丰富,在资源较丰富的Node上新建一个MRAppMstr容器
- MRAppMstr容器建立好后需向ResourceManager提交注册请求,注册成功后后面只需向其汇报工作状态即可
- 当执行MR请求时,ResourceScheduler会给MRAppMstr分配执行Job所需的资源,得到反馈后,MRAppMstr在所有Node上启动相应的任务,而这些任务都是装在每个Node的容器中,任务有些事MapTask,有些是ReduceTask
- 每个Node在任务执行过程中,都会一直向ResourceManager汇报状态,一旦任务完成,ResourceManager就会回收所有的资源,并注销MRAppMstr容器
5.2.8 Yarn HA方案
说明:在上面的执行过程中,我们可以看到实际上yarn中的ResourceManager负责整个集群的资源调度和任务调度;为了解决单点故障问题,Yarn高可用性方案采用了引入冗余的ResourceManager节点的方式。Zookeeper时刻通过心跳机制监听ResourceManager的状态,一旦出现故障,则启动第二ResourceManager。
5.3 Yarn的资源管理和任务调度
5.3.1 资源管理
说明:
- 每个NodeManager可分配的内存和CPU的数量可以通过在Yarn服务配置页面配置选项设置
- 在Hadoop3.x版本中,yarn资源模型已被推广为支持用户自定义的
可数资源类型
,而不是仅仅支持CPU和内存;常见的可数资源类型,除了CPU和Memory以外,还包括GPU资源,软件licenses或本地附加存储器之类的资源,但不包括端口和标签。
5.3.2 Yarn的三种资源调度器
说明:在Yarn中,负责给应用分配资源的叫做Scheduler(调度器)。根据不同的策略,yarn为我们提供了三种调度器:
- FIFO Scheduler:利用队列执行先进先出策略
- Capacity Scheduler:允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,通过设置多个队列的方式给多个组织提供服务;除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了。在一个队列内部,资源的调度采用的同样式FIFO策略
- FairScheduler:公平调度策略
5.3.3 容量调度器
说明:容量调度器使得Hadoop应用能够共享的,多用户的,操作简便的运行在集群上,同时最大化集群的吞吐量和利用率。
容量调度器以队列
为单位划分资源,么给队列都有资源使用的下限和上限。每个用户可以设定资源使用上限。管理员可以约束单个队列、用户或作业的资源使用。支持作业优先级,但不支持抢占。
在Hadoop3.x中,OrgQueue扩展了容量调度器,通过REST API
提供了编程的方式来改变队列的配置,这样,管理员可以在队列的adminster-queueACL中自动进行队列的配置管理。
5.3.4 资源分配模型
说明:调度器维护一群队列的信息;用户可以向一个或多个队列提交应用。
每个NodeManager心跳的时候,调度器根据一定的规则
选择一个队列,再在这个队列上选择一个应用,尝试在这个应用上进行分配资源。
调度器会优先匹配本地资源的申请请求,其次是同机架的,最后是任意机器的。
5.4 华为对Yarn的增强特性
5.4.1 Yarn动态内存管理
说明:华为大数据对Yarn提供了动态内存容器技术。前面我们提到过,所有的任务都是运行在各个Node的容器中,在传统的Hadoop平台中,我们的容器是固定大小的,一旦任务所需的内存超过了容器的内存设置大小,那么任务会执行失败;而在华为的大数据方案中,在运行容器的同时会同时计算容器的内存使用,如果任务的大小超过了容器的内存阈值,则会向NodeManager请求扩容容器;在任务内存大小不超过NodeManager设定的阈值范围内对容器进行扩容时允许的,若超过了阈值则终止任务。
5.4.2 Yarn基于标签调度
说明:我们可以对不同的应用打上不同的标签。对于常规资源需求的应用,我们通过打标签的方式可以将其固定分配给普通性能的机器,而把高内存需求的应用分配给高内存机器。