本章主要讲述大数据领域中最著名的批处理与离线处理计算框架 MapReduce,包括 MapReduce 的原理、流程、使用场景,以及 Hadoop 集群中负责统一的资源管理与调度的组件 Yarn,包括 Yarn 的定义、功能与架构、HA 方案和容错机制,以及利用 Yarn 完成资源调配的常用方法。最后,还简单介绍华为为这些组件所提供的增强特性。
MapReduce 适用于数据密集型任务,还是计算密集型任务?
MapReduce 1.x 主要包括哪些角色?主要功能是什么?
Client:用户编写的MapReduce程序通过Client提交到JobTracker端
JobTracker:负责资源控制和作业调度;负责监控所有TaskTracker与Job的健康状况,一旦出现失败,就把相应的任务转移到其他节点;JobTracker会跟踪任务的执行进度、资源使用量等信息,并把这些信息告诉任务调度器(TaskTracker),而调度器会在资源出现空闲的时候,选择合适的任务去使用这些资源。
TaskTracker:会周期地通过“心跳”将本节点上的资源使用情况和任务运行进度汇报给JobTracker,同时接收jobTracker发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)
TaskTracker使用”slot”(槽)等量划分本节点上的资源量(CPU、内存等)。一个Task获取到一个Slot后才有机会运行。而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot 分为MapSlot和ReduceSlot,分别提供给mapTask和reduceTask使用。
Task:分为MapTask和ReduceTask两种,均由TaskTracker启动。
Yarn主要分担了MapReduce 1.x中的哪些功能?
Yarn默认包含哪三种三种资源调度器?
FIFO调度器
先进先出,但不适合资源公平性
容量调度器
独立的专门队列保证小作业也可以提交后就启动,队列容量是专门保留的以整个集群的利用率为代价,与FIFO比,大作业执行的时间要长
公平调度器
不需要预留资源,调度器可以在运行的作业之间动态平衡资源,大作业启动时,因为是唯一运行的,所以获得集群的所有资源,之后小作业启动时,被分配到集群的一半的资源,这样每个作业都能公平共享资源。
MapReduce基于Google发布的MapReduce论文设计开发,基于分而治之的思想,用于大规模数据集(大于1TB)的并行计算和离线计算,具有如下特点:
MapReduce是一个基于集群的高性能并行计算平台(Cluster Infrastructure)。
MapReduce是一个并行计算与运行软件框架(Software Framework)。
MapReduce是一个并行程序设计模型与方法(Programming Model & Methodology)。
在 Hadoop1.0 版本中,只有 HDFS 和 MapReduce,而资源调度通过MRv1来进行,存在着很多缺陷:
因此,针对Hadoop1.0中MRv1的不足,以及为了满足编程范式多样化的需求,Hadoop2.0中正式引入了Yarn框架,以便更好地完成集群的资源调度与分配。
Apache Hadoop YARN (Yet Another Resource Negotiator),中文名为“另一种资源协调者”。它是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
Yarn是轻量级弹性计算平台,除了MapReduce框架,还可以支持其他框架和多种计算模式,比如Spark、 Storm等。
MapReduce 计算过程可具体分为两个阶段,:Map阶段和Reduce阶段。其中 Map 阶段输出的结果就是Reduce阶段的输入。可以把MapReduce理解为,把一堆杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果。
不同的Map任务之间不会进行通信,不同的Reduce任务之间也不会发生任何信息交换,用户不能显式地从一台机器向另一台机器发送消息,所有的数据交换都是通过MapReduce框架自身去实现的。
Job提交前,先将待处理的文件进行分片(Split),MR框架默认将一个块(Block)作为一个分片。客户端应用可以重定义块与分片的映射关系。
Map阶段先把数据放入一个环形内存缓冲区,当缓冲区数据达到80%左右时发生溢写(Spill),需将缓冲区中的数据写入到本地磁盘,这个就是shuffle操作。输出文件作为 Reduce 的输入。
写入本地磁盘之前通常需要做如下处理(shuffle):
合并(Combine)和归并(Merge)的区别:两个键值对<“a”,1>和<“a”,1>,如果合并,会得到<“a”,2>,如果归并,会得到 <“a”,<1,1>>
前面的MOF文件是经过排序处理的,将其从磁盘拷贝进对应 Reduce 任务的缓存中。
通常在Map Task任务完成MOF输出进度到3%时启动Reduce,从各个Map Task获取MOF 文件。前面提到Reduce Task个数由客户端决定,Reduce Task个数决定MOF文件分区数。 因此Map Task输出的MOF文件都能找到相对应的Reduce Task来处理。
当Reduce Task接收的数据量不大时,则直接存放在内存缓冲区中,随着缓冲区文件的增多, MR后台线程将它们合并成一个更大的有序文件,写到磁盘中,这个动作是Reduce阶段的Merge操作(shuffle),过程中会产生许多中间文件,然后从磁盘读出来,最后一次合并的结果直接输出到用户自定义的reduce函数。
当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce
Shuffle的定义:Map阶段和Reduce阶段之间传递中间数据的过程,包括ReduceTask从各个Map Task获取MOF文件的过程,以及对MOF的排序与合并处理。
假设要分析一个大文件A里每个英文单词出现的个数,利用MapReduce框架能快速实现这一统计分析。
分析过程如图:
1、待处理的大文件A已经存放在HDFS上,大文件A被切分的数据块split:A.1、A.2、A.3分别 存放在DataNode #1、#2、#3上。
2、WordCount分析处理程序实现了用户自定义的Map函数和Reduce函数。WordCount 将分析应用提交给RM,RM根据请求创建对应的Job,并根据文件块个数按文件块分片,创建 3个 MapTask 和 3个Reduce Task,这些Task运行在Container中(2.0版本中的容器能复用)
3、Map Task 1、2、3的输出是一个经分区与排序的MOF文件。Map 端的输出是键值对,Merge以后 Reduce 端输入是键和值列表。
4、Reduce Task从 Map Task获取MOF文件,经过合并、排序,最后根据用户自定义的 Reduce逻辑,输出如表所示的统计结果。
主要包含三个组件:
在 Hadoop 1.0 中只有 JobTracker 和 TaskTracker,其中 JobTracker 负责资源管理调度、任务监控与调度、任务重启与恢复,任务繁重。
Hadoop 2.0 中 JobTracker 部分任务给了 Resource Manager 和 Application Master,Node Manager 则负责监控任务执行。
在图中有两个客户端向Yarn提交任务,蓝色表示一个任务流程,棕色表示另一个任务流程。
首先client提交任务,ResourceManager接收到任务,然后启动并监控起来的第一个Container,也就是App Mstr。 App Mstr通知nodemanager管理资源并启动其他container。任务最终是运行在Container当中。
Yarn中的ResourceManager负责整个集群的资源管理和任务调度,Yarn高可用性方案通 过引入冗余的ResourceManager节点的方式,解决了ResourceManager单点故障问题。
与HDFS的高可用性方案类似,任何时间点上都只能有一个ResourceManager 处于Active状态。当Active状态的ResourceManager发生故障时,可通过自动或手动的方式 触发故障转移,进行Active/Standby状态切换。
如果AM意外停止运行, ResourceManager 会关闭 ApplicationAttempt 中管理的所有 Container,包括当前任务在 NodeManager 上正在运行的所有Container。RM会在另一计算节点上启动新的 ApplicationAttempt。
YARN支持在新的ApplicationAttempt启动时,保留之前Container的状态,因此运行中的作业可以继续无故障的运行。
每个NodeManager可分配的内存和CPU的数量可以通过配置选项设置(可在Yarn服务配置页面配置)。
yarn.nodemanager.resource.memory-mb
表示用于当前NodeManager上可以分配给容器 的物理内存的大小,单位:MB。必须小于NodeManager服务器上的实际内存大小。
yarn.nodemanager.vmem-pmem-ratio
表示为容器设置内存限制时虚拟内存跟物理内存的 比值。容器分配值使用物理内存表示的,虚拟内存使用率超过分配值的比例不允许大于当前这个比例。
yarn.nodemanager.resource.cpu-vcore
表示可分配给container的CPU核数。建议配置为 CPU核数的1.5-2倍。
在Hadoop3.x版本中,YARN资源模型已被推广为支持用户自定义的可数资源类型 ( support user-defined countable resource types ) ,而不是仅仅支持CPU和内存。
常见的可数资源类型,除了CPU和Memory以外,还包括GPU资源、软件licenses或本地附加存 储器( locally-attached storage )之类的资源,但不包括端口(Ports)和标签(Labels)。
在一个很繁忙的集群资源往往是有限的。在Yarn中,负责给应用分配资源的叫做Scheduler (调度器)。根据不同的策略,共有三种调度器可供选择:
调度器维护一群队列的信息。用户可以向一个或者多个队列提交应用。
每次NM心跳的时候,调度器根据一定的规则选择一个队列,再在队列上选择一个应用,尝试在这个应用上分配资源。
调度器会优先匹配本地资源的申请请求,其次是同机架的,最后是任意机器的。
只有当NodeManager中的所有Containers的总内存使用超过了已确定的阈值,那么那些内存使用过多的Containers才会被终止。单个超过还能继续运行。
在没有标签调度之前,任务提交到哪个节点上是无法控制的,会根据一些算法及条件,集群随机分配到某些节点上。
而标签调度可以指定任务提交到哪些节点上。用户可以为每个 nodemanager标注一个标签,比如之前需要消耗高内存的应用提交上来,由于运行在那些节点不可控,任务可能运行在普通性能的机器上。
下面哪些是MapReduce的特点? ( ABD )
A.易于编程
B. 良好的扩展性
C. 实时计算
D. 高容错性
Yarn中资源抽象用什么表示? ( C )
A.内存
B. CPU
C. Container
D. 磁盘空间
下面哪个是MapReduce适合做的? ( B )
A. 迭代计算
B. 离线计算
C. 实时交互计算
D. 流式计算
离线计算以Hadoop的MapReduce为代表、近实时计算以Spark内存计算为代表、在线实时计算以Storm、KafkaStream、SparkStream为代表