yarn的详解

yarn是什么?

yarn是hadoop集群的资源管理系统,是hadoop2中引入的。最初的目的是为了改善MapReduce的实现。

hadoop为什么引入yarn?

解释这个问题之前我们先来了解一下hadoop1中mapreduce的运行机制。

具体流程如下:
1).客户端通过submit()方法提交作业

2).submit()方法会创建一个内部的JobSummiter实例,并且调用submitJobInternal()方法提交作业,JobSummiter向JobTracker请求一个新的作业ID,该实例会检查本次作业是否可执行(比如:检查输出路径,计算作业的输入分片等),如果可执行会将运行所需要的作业资源(JAR、配置文件等)上传到文件系统(HDFS),

3).JobTracker接受到提交任务请求后,会放到一个内部队列里中,交由作业调度器(Job Scheduler)进行调度并初始化任务,从文件系统中获取客户端已经好的输入分片,(每个分片计算一个map),reduce任务数量由setNumReduceTask()方法设置

4).TaskTracker会定期向JobTracker发送“心跳”,表明TaskTracker是否存活,同时“心跳”是两者之间的消息通道,当TaskTracker空闲后,会通过“心跳”发送给JobTracker,然后JobTracker会为它分配任务。

5).TaskTracker接收到JobTracker分配的任务后,从分布式文件系统中JAR文件复制到本地,开始运行任务。任务运行过程中TaskTracker会定期通过“心跳”会将任务的状态及运行情况告知JobTracker

6).JobTracker接收到最后一个任务已完成的通知后,Job会打印一条消息告知用户,然后从waitForCompletion()方法返回,同时Job的统计信息及计数值也会打印到控制台

 通过对上述工作原理的剖析我们可以发现。在hadoop1中mapredeuce的运行中有两个问题:

1.jobtracker同时负责作业的调度(将任务与tasktracker匹配)和任务进程的监控(跟踪任务,重启失败,或迟缓的任务,记录任务流水),那么就存在一个单点故障的问题。

2.正对taskTracker,在taskTracker端,用map/reduce task作为资源的表示过于简单,没有考虑到CPU、内存等资源情况,当把两个需要消耗大内存的task调度到一起,很容易出现OOM。另外。把资源强制划分为map/reduce slot,当只有map task时,reduce slot不能用;当只有reduce task时,map slot不能用,容易造成资源利用不足。

所以为了解决上边的问题。hadoop引入了yarn

yarn的整体描述

yarn的核心组件

 yarn的工作流程

 

具体流程如下:
步骤1)和2)通MapReduce相似,不同的是作业ID是从资源管理器(RM)中获取,而不是JobTracker,在YARN中命名法中它是一个应用程序ID,最后调用submitApplication()方法提交作业

3).资源管理器收到作业请求后,便把请求传递给调度器,调度器分配一个容器,然后资源管理器在节点管理器的管理下在容器中启动应用程序的master进程。

4).master进程是一个java应用程序,它的主类是MRAppMaster,它对作业进行初始化:通过创建多个薄记对象以保持对作业进度的跟踪,因为它将接受来自任务的进度和完成报告。

5).master接受来自HDFS在客户端计算的输入分片,对每个分片创建一个map任务对象以及由mapreduce.job.reduces属性确定的多个reduce任务对象。

6).如果作业不适合在单个节点上运行,那么application master就会为该作业中的所有map任务和reduce任务向资源管理器请求容器,附着心跳信息的请求包括每个map任务的数据本地化信息,特别是输入分片所在的主机和相应机架信息,调度器使用这些信息来做调度决策,先数据本地化,再机架本地化。

7).一旦资源管理器的调度器为任务分配了容器,application master就通过与节点管理器通信来启动容器,在运行任务之前,首先将任务所需要的资源本地化,包括作业的配置、jar文件和所有来自分布式缓存的文件,然后执行map任务或reduce任务。

yarn的核心组件的详解

yarn的核心组件之AM:Yarn 中每个应用都会启动一个AM,负责向RM申请资源,请求NM启动Container,并告诉Container做什么事情

yarn的核心组件之RM:负责协调集群上计算资源的分配

yarn的核心组件之NM:负责启动和监视集群中机器上的计算容器(Container)

 

 

yarn的核心组件之container:资源容器,YARN中所有的应用都是在container之上运行的。AM也是在container上运行的,不过AM的container是RM申请的