YARN资源调度框架
Yarn资源调度系统
一、课前准备
1. 三个节点的hadoop集群
二、课堂主题
1. yarn架构、核心组件
2. yarn应用提交过程
3. yarn的调度策略
4. yarn的优化
三、课堂目标
1. 数据yarn资源的任务调度原理
2. 熟练对yarn集群进行维护
3. 了解如何使用YARN的可扩展性、效率和灵活性来增加集群性能
四、知识要点
1. yarn介绍
Apache Hadoop YARN是apache Software Foundation Hadoop的子项目,为分离Hadoop2.0资源管理和
计算组件而引入。YARN的诞生源于HDFS的数据需要更多的交互模式,不单单是MapReduce模式。Hadoop2.0
的YARN架构提供了更多的处理框架,不再强迫使用MapReduce框架。
当企业的数据在HDFS中是最可用的,有多钟数据处理方式是非常重要的。有了Hadoop2.0和YARN,机构可以采用流处理
互动数据处理方式以及其他的基于Hadoop的应用程序。
2. yarn架构
YARN还是经典的主从(master/slave)架构,如下图。大体上看,YARN服务由一个ResourceManager(RM)
和多个NodeManager(NM)构成,ResourceManager为主节点(master),NodeManager为从节点(slave)。
ApplicationMaster可以在容器内运行任何类型的任务。例如,MapReduceApplicationMaster请求容器启动map
或reduce任务,而Giraph ApplicationMaster请求容器运行Giraph任务。
3. yarn应用运行原理
YARN是如何工作的?YARN的基本理念是将JobTracker/TaskTracker两大职能分割为以下几个实体:
1. 一个全局的资源管理ResourceManager
2. 每个应用程序一个ApplicationMaster
3. 每个从节点一个NodeManager
4. 每个应用程序一个运行在NodeManager上的Container
ResourceManager和NodeManager组成了一个新的、通用的、用分布式管理应用程序的系统。
ResourceManager对系统中的应用程序资源有终极仲裁的权限。ApplicationMaster是一个特定于框架的实体,
它的责任是同ResourceManager谈判资源,同时为NodeManager(S)执行和监控组件任务。ResourceManager有一个
调度器,根据不同的约束条件,例如队列容量、用户限制等,将资源进行分配给各类运行着的应用程序。调度器执行的
调度功能是基于应用程序的资源申请。NodeManager负责发布应用程序容器,监控资源的使用并向ResourceManager进行汇报。
每个ApplicationMaster都有职责从调度器那谈判得到适当的资源容器,追踪它们的状态,并监控他们的进程。从系统
的视图看,ApplicationMaster作为一个普通的容器运行着。
3.1 yarn应用提交过程
Application在Yarn中的执行过程,整个执行过程可以总结为三步:
1. 应用程序提交
2. 启动应用的ApplicationMaster实例
3. ApplicationMaster实例管理应用程序的执行
具体提交过程为:
1. 客户端程序向ResourceManager提交应用并请求一个ApplicationMaster实例;
2. ResourceManager找到一个可以运行一个Container的NodeManager,并在这个Container中启动ApplicationMaster实例;
3. ApplicationMaster向ResourceManager进行注册,注册之后客户端就可以查询ResourceManager获得自己ApplicationMaster
的详细信息,以后就可以和自己的ApplicationMaster直接交互了(这个时候,客户端主动和ApplicationMaster交流,
应先向ApplicationMaster发送一个满足自己需求的资源请求);
4. 在平常的操作过程中,ApplicationMaster根据resource-request协议向ResourceManager发送resource-request请求;
5. 当Container被成功分配后,ApplicationMaster通过向NodeManager发送container-launch-specification信息来启动
Container,Container-launch-specification信息包含了能够让Container和ApplicationMaster交流所需要的资料;
6. 应用程序的代码以task形式在启动的Container中运行,并把运行的进度、状态等信息通过application-specific
协议发送给ApplicationMaster;
7. 在应用程序运行期间,提交应用的客户端主动和ApplicationMaster交流获得应用的运行状态,进度更新等信息,
交流协议也是application-specific协议;
8. 一旦应用程序执行完成并且所有相关工作也以及完成,ApplicationMaster向ResourceManager取消注册然后关闭,
用到所有的Container也归还系统;
精简版:步骤1:用户将应用程序提交到ResourceManager上;步骤2:ResourceManager为应用程序ApplicationMaster申请资源
并与某个NodeManager通信启动第一个Container,以启动ApplicationMaster;
步骤3:ApplicationMaster与ResourceManager注册进行通信,为内部要执行的任务申请资源,一旦得到资源后,
将于NodeManager通信,以启动对应的Task;步骤4:所有任务运行完成后,ApplicationMaster向ResourceManager注销,
整个应用程序运行结束。
3.2 MapReduce on yarn
MapReduce基于yarn的工作原理:我们通过提交jar包,进行MapReduce处理,那么这个那个运行过程分为五个环节:
1、向client端提交MapReduce job
2、随后yarn的ResourceManager进行资源的分配
3、由NodeManager进行加载与监控Containers
4、通过applicationMaster与ResourceManager进行资源的申请及状态的交互,由NodeManager进行
MapReduce运行时job的管理
5、通过hdfs进行job配置文件、jar包的各节点分发
Job初始化过程
1、当resourceManager收到了submitApplication()方法的调用通知后,Scheduler开始分配container,
随之ResourceManager发送applicationMaster进行,告知每个NodeManager管理器
2、由ApplicationMaster决定如何运行tasks,如果job数据量比较小,ApplicationMaster便选择将task运行在一个JVM
中。那么如何判断这个job是大是小呢?当一个job的mappers数量小于10个,只有一个reducer或者读取的文件大小要
小于HDFS block时,(可通过修改配置项
mapreduce.job.ubertask.maxmaps
mapreduce.job.ubertask.maxreduce以及
mapreduce.job.ubertask.maxbytes进行调整)
3、在运行task之前,applicationMaster将会调用setupJob()方法,随之创建output的输出路径(这就能够
解释,不管你的mapreduce一开始是否报错,输出路径都会创建)
Task任务分配
1、接下来applicationMaster向ResourceManager请求containers用于执行map与reduce的tasks(set 8),
这里map task的优先级要高于reduce task,当所有的map tasks执行了百分之五的时候,将会请求
reduce,具体下面再总结
2、 运行tasks的是需要消耗内存与CPU资源的,默认情况下,map和reduce的task资源分配为
1024M与一个核,(可修改运行的最小与最大参数配置,
mapreduce.map.memory.mb,
mapreduce.reduce.memory.mb,
mapreduce.map.cpu.vcores,
mapreduce.reduce.cpu.vcores)
Task任务执行
1、这时一个task已经被ResourceManager分配到一个container中,由applicationMaster告知nodemanager
启动container,这个task将会被一个主函数为YarnChild的java application运行,但在运行task之前,
首先定位task需要的jar包、配置文件以及加载在缓存中的文件。
2、YarnChild运行与一个专属的JVM中,所以任何一个map或reduce任务出现问题,都不会影响整个nodemanager的
crash或者hang。
3、每个task都可以在相同的JVM task中完成,随之将完成的处理数据写入临时文件中
MapReduce数据流进行进度与状态更新
1、MapReduce是一个较长运行时间的批处理过程,可以是一小时、几小时甚至几天,那么Job的运行状态监控
就非常重要。每个job的运行状态监控就非常重要。每个job以及每个task都有一个包含job
(running,successfully completed,tailed)的状态,以及value的计数器,状态信息及描述信息
(描述信息一般都是在代码中加的打印信息),那么,这些信息是如何与客户端进行通信的呢?
2、当一个task开始执行,它将会保持运行记录,记录task完成的比例,对于map的任务,将会记录其运行的
百分比,对于reduce来说可能复杂点,但系统依旧会估计reduce的完成比例,当一个map或reduce任务执行时,
子进程会持续每三秒钟与applicationMaster进行交互。Job完成
3.3 yarn应用生命周期
RM:Resource Manager
AM:Application Master
NM:Node Manager
1. Client向RM提交应用,包括AM程序及启动AM的命令
2. RM为AM分配宇哥容器,并与对应的NM通信,令其在容器上启动应用的AM
3. AM启动时向RM注册,允许Client向RM获取AM信息然后直接和AM通信
4. AM通过资源请求协议,为应用协商容器资源
5. 如容器分配成功,AM要求NM在容器中启动应用,应用启动后可以和AM独立通信
6. 应用程序在容器中执行,并向AM汇报
7. 在应用执行期间,Client和AM通信获取应用状态
8. 应用执行完成,AM向RM注销并关闭,释放资源。
申请资源=》启动appmaster=》申请宁运行任务的container=》分发task=》运行task=》task结束=》回收和container
4. 如何使用yarn
5. yarn调度器
未完成 01:05:34,今天脑子不在状态,就到这了,去过一遍hive了,拜拜了您嘞