YARN介绍
YARN的设计思想:
1、当Hadoop集群的节点数很多时(一般1000个以上),MRv1机制就面临着性能瓶颈,因为jobtracker的负担过重,且是系统的一个单点。
于是在Hadoop2.x中引入了YARN(Yet Another Resource Negotiator)。
2、YARN将jobtracker的职能划分为多个独立的实体,从而改善了经典的MapReduce机制面临的扩展性瓶颈问题。
3、jobtracker同时负责作业调度和任务进度监视。YARN将这两种角色划分为两个独立的守护进程:
管理集群上资源使用的资源管理器(resource manager,RM)和管理集群上运行任务生命周期的应用管理器(application master,AM)。
基本思路是:application master与resource manager协商集群的资源;
每个容器(container)有特定的内存和核数上限,在这些容器上运行特定应用程序的进程。
容器由集群节点上运行的节点管理器(node manager,NM)监视,以确保应用程序使用的资源不会超过分配给它的资源。
4、与jobtracker不同,每个MapReduce作业有一个专用的application master,它在作业的运行期间一直运行着。
5、YARN比经典MapReduce机制更具一般性,实际上MapReduce只是YARN应用的一种形式。有很多其他的应用可以运行于YARN之上(例如Spark)。
YARN设计的精妙之处在于不同的YARN应用可以在同一个集群上工作,这大大提高了集群的利用率,也可以方便地共享数据。
YARN上的MapReduce比经典的MapReduce包括更多实体:
1、提交MapReduce作业的客户端
2、YARN resource manager,负责协调集群上计算资源的分配
3、YARN node manager,负责启动和监视集群中机器上的计算容器
4、MapReduce application master,负责协调运行MapReduce作业的任务。它和MapReduce task在容器中运行,这些容器由resource manager分配并由node manager进行管理。
5、分布式文件系统,一般为HDFS,用于在其他实体间共享作业的资源
MRv2的具体步骤:
一、作业提交
与MRv1这步非常类似。客户端的MapReduce程序开始执行后,Job的submit()方法
创建一个内部的JobSubmitter实例,并调用其submitJobInternal()方法来真正提交。提交过程如下:
1、通过调用向resource manager请求一个新的作业ID。
2、检查作业的输出参数。例如,如果没有指定输出目录或输出目录已经存在,作业就不提交,向客户端抛出一个异常。
3、计算作业的输入分片。如果分片无法计算,比如因为输入路径不存在,作业就不提交,向客户端抛出一个异常。
4、将运行作业所需要的资源(包括作业Jar包、配置文件和输入数据分片)复制到HDFS中一个以作业ID命名的目录下。作业Jar包会设置较多个副本数(默认10个),
因此在运行作业的任务时,集群中有较多的副本可供task访问。
5、调用resource manager的submitApplication()方法提交作业。
二、作业初始化
resource manager收到调用它的submitApplication()消息后,便将请求传递给调度器(scheduler)。
调度器分配一个容器,然后resource manager在node manager的管理下在容器中启动application master进程。
MapReduce作业的application master是一个Java应用程序,它的主类是MRAppMaster。它先
对作业进行初始化:通过创建多个簿记对象以保持对作业进度的跟踪,以接受来自任务的进度和完成报告。
接下来,它从HDFS中获取客户端已经计算好的输入分片。
然后为每个分片创建一个map任务。创建的reduce任务的数量由mapreduce.job.reduces属性决定,
也可用Job的setNumReduceTask()方法设置,然后任务调度器创建该数量的reduce任务。任务ID在此时确定。
接下来,application master决定如何运行构成MapReduce作业的各个任务。如果作业很小,
就选择在它的同一个JVM中运行任务。这发生在application master做出如下判断:相比于在一个节点上顺序运行任务,
如果在新容器中分配和运行任务的开销大于并行计算的收益时,就会发生这一情况。
这不同于MRv1,MRv1从不在单个tasktracker上运行小作业。这一的作业称为uberized,或者作为uber任务运行。
小任务的标准:默认情况下,小于10个mapper且只有1个reducer,且输入大小小于1个HDFS块的任务。
(可通过设置mapreduce.job.ubertask.maxmaps, mapreduce.job.ubertask.maxreduces, mapreduce.job.ubertask.maxbytes 改变这些值)
uber任务需要对作业或集群设置mapreduce.job.ubertask.enable为true(默认为false)来显式地启用。
最后,在任何任务运行之前,application master调用OutputCommitter的setupJob()方法。
对FileOutputCommitter(默认),将创建作业的最终输出目录,以及任务输出的临时工作目录。
而在MRv1中,这是在一个由tasktracker运行的特殊任务中被调用的。
三、任务分配
如果作业不适合作为uber任务运行,那么application master就会为该作业中的所有map和reduce任务向resource manager请求容器。
为map任务的请求比为reduce任务的请求优先级高,会先发送,
因为在reduce的排序阶段开始前所有map任务都需要完成。直到5%的map任务完成,reduce任务的请求才会开始发送。
对于map任务的分配,调度器会考虑数据本地性,尽量选择与数据近的节点。对于reduce任务,可在集群的任何节点执行。
任务的请求也指定了内存和CPU需求。默认情况,每个map和reduce任务分配1024MB内存和1
个虚拟核。这两个值可通过以下属性在作业层面设置(但受限于集群层面配置的最大和最小值):
mapreduce.map.memory.mb, mapreduce.reduce.memory.mb, mapreduce.map.cpu.vcores, mapreduce.reduce.cpu.vcores。
这种资源分配方式不同于MRv1,在MRv1中每个tasktracker有固定数量的槽,每个任务在一个槽上运行。
槽有最大内存分配限制(无CPU限制),这对集群是固定的,导致当任务使用较少内存时无法充分利用内存,
任务较大时又不能够获取足够内存而导致整个作业失败。YARN中的资源管理则更为细粒度,所以可以避免上述问题。
四、任务执行
一旦resource manager的调度器为任务分配了特定节点上的一个容器,application master就通过与node manager通信来启动容器。
该任务由主类为YarnChild的Java应用程序执行。在它运行任务之前,首先将任务需要的资源本地化,包括作业的配置、Jar包和所有来自HDFS的文件。
最后,运行map或reduce任务。
YarnChild运行于专用的JVM中,这样用户定义的map和reduce的任何异常都不会影响到node manager。
每个任务都会执行设置和提交操作,操作的线程与任务本身运行与同一个JVM中,由作业的OutputCommitter决定。
对基于文件的作业,提交操作将任务输出从临时目录移动到其最终目录。
提交协议确保当推测执行(speculative execution)启用时,只有一个任务副本被提交,其他的都将取消。
五、进度和状态更新
这步和MRv1比较相似。在YARN下运行时,任务每3秒通过umbilical接口向application master汇报进度和状态(包含计数器),作为作业的汇聚视图。
客户端每秒钟(通过mapreduce.client.progressmonitor.pollinterval配置)查询一次application master以接收进度更新,
并向用户显示。也可以通过YARN的管理页面查看作业进度。
六、作业完成
当application master收到作业最后一个任务已完成的通知后,便把作业的状态设置为“成功”。
之后在Job查询状态时,便知道任务已成功完成,于是Job打印一条消息告知用户,
以及输出统计信息和计数值,然后从waitForCompletion()方法返回。
最后,当作业完成时,application master和任务容器清空工作状态(删除中间输出),
OutputCommitter的commitJob()方法会被调用。job history server保存作业的信息,供用户今后需要时查询。
YARN资源隔离:
1、资源隔离是指为不同任务提供可独立使用的计算资源以避免它们相互干扰。当前存在很多资源隔离技术,
比如硬件虚拟化、虚拟机、Cgroups、Linux Container等。
2、YARN对内存资源和CPU资源采用了不同的资源隔离方案。对内存资源,YARN采用了进程监控的方案控制内存使用,
即每个NM启动一个额外监控线程监控每个Container内存资源使用量,
一旦发现它超过配置的资源量,则将其杀死。对于CPU资源,则使用Cgroups方案进行隔离。
3、另外,YARN使用队列来对不同用户提交的作业进行资源控制,关于队列的知识,我们在后面介绍大数据集群安全时再补充。
浙公网安备 33010602011771号