8、Yarn资源调度系统架构与原理分析

网友投稿 243 2022-11-26

8、Yarn资源调度系统架构与原理分析

@[TOC]

1、Yarn介绍

2、Yarn架构

核心组件:
组件名 作用
ResourceManager 相当于这个Application的监护人和管理者,负责监控、管理这个Application的所有Attempt在cluster中各个节点上的具体运行,同时负责向YarnResourceManager申请资源、返还资源等;
ApplicationMaster 相当于这个Application的监护人和管理者,负责监控、管理这个Application的所有Attempt在cluster中各个节点上的具体运行,同时负责向YarnResourceManager申请资源、返还资源等;
NodeManager 是Slave上一个独立运行的进程,负责上报节点的状态(磁盘,内存,cpu等使用信息);
Container 是yarn中分配资源的一个单位,包涵内存、CPU等等资源,YARN以Container为单位分配资源;

2.1 、ResourceManager

RM是一个全局的资源管理器,集群只有一个,负责整个系统的资源管理和分配,包括处理客户端请求、启动/监控ApplicationMaster、监控 NodeManager、资源的分配与调度。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。   (1)调度器   调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。需要注意的是,该调度器是一个“纯调度器”,它从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。   调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(ResourceContainer,简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。   (2)应用程序管理器应用程序管理器主要负责管理整个系统中所有应用程序,接收job的提交请求,为应用分配第一个 Container 来运行 ApplicationMaster,包括应用程序提交、与调度器协商资源以启动 ApplicationMaster、监控ApplicationMaster 运行状态并在失败时重新启动它等。

2.2 、ApplicationMaster

管理 YARN 内运行的一个应用程序的每个实例。关于 job 或应用的管理都是由 ApplicationMaster 进程负责的,Yarn 允许我们以为自己的应用开发 ApplicationMaster。   功能:   (1)数据切分;   (2)为应用程序申请资源并进一步分配给内部任务(TASK);   (3)任务监控与容错;   负责协调来自ResourceManager的资源,并通过NodeManager监视容易的执行和资源使用情况。Yarn 的动态性,就是来源于多个Application 的ApplicationMaster 动态地和 ResourceManager 进行沟通,不断地申请、释放、再申请、再释放资源的过程。

2.3 、NodeManager

NodeManager 整个集群有多个,负责每个节点上的资源和使用。   NodeManager 是一个 slave 服务:它负责接收 ResourceManager 的资源分配请求,分配具体的 Container 给应用。同时,它还负责监控并报告 Container 使用信息给 ResourceManager。通过和ResourceManager 配合,NodeManager 负责整个 Hadoop 集群中的资源分配工作。   功能:本节点上的资源使用情况和各个 Container 的运行状态(cpu和内存等资源)   (1)接收及处理来自 ResourceManager 的命令请求,分配 Container 给应用的某个任务;   (2)定时地向RM汇报以确保整个集群平稳运行,RM 通过收集每个 NodeManager 的报告信息来追踪整个集群健康状态的,而 NodeManager 负责监控自身的健康状态;   (3)处理来自 ApplicationMaster 的请求;   (4)管理着所在节点每个 Container 的生命周期;   (5)管理每个节点上的日志;   (6)执行 Yarn 上面应用的一些额外的服务,比如 MapReduce 的 shuffle 过程;   当一个节点启动时,它会向 ResourceManager 进行注册并告知 ResourceManager 自己有多少资源可用。在运行期,通过 NodeManager 和 ResourceManager 协同工作,这些信息会不断被更新并保障整个集群发挥出最佳状态。NodeManager 只负责管理自身的 Container,它并不知道运行在它上面应用的信息。负责管理应用信息的组件是ApplicationMaster

2.4 、Container

Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当 AM 向RM 申请资源时,RM 为 AM 返回的资源便是用 Container 表示的。YARN 会为每个任务分配一个 Container,且任务只能使用该 Container 中描述的资源。   Container 和集群节点的关系是:一个节点会运行多个 Container,但一个 Container 不会跨节点。任何一个 job或 application 必须运行在一个或多个 Container 中,在 Yarn 框架中,ResourceManager 只负责告诉ApplicationMaster 哪些 Containers 可以用,ApplicationMaster 还需要去找 NodeManager 请求分配具体的Container。   需要注意的是,Container 是一个动态资源划分单位,是根据应用程序的需求动态生成的。目前为止,YARN 仅支持 CPU 和内存两种资源,且使用了轻量级资源隔离机制 Cgroups 进行资源隔离。

2.5 、Resource Request 及 Container

Yarn的设计目标就是允许我们的各种应用以共享、安全、多租户的形式使用整个集群。并且,为了保证集群资源调度和数据访问的高效性,Yarn还必须能够感知整个集群拓扑结构。   为了实现这些目标,ResourceManager的调度器Scheduler为应用程序的资源请求定义了一些灵活的协议,通过它就可以对运行在集群中的各个应用做更好的调度,因此,这就诞生了Resource Request和Container。一个应用先向ApplicationMaster发送一个满足自己需求的资源请求,然后ApplicationMaster把这个资源请求以   resource-request的形式发送给ResourceManager的Scheduler,Scheduler再在这个原始的resource-request中返回分配到的资源描述Container。每个ResourceRequest可看做一个可序列化Java对象,包含的字段信息如下:

2.6 、JobHistoryServer

2.7、Timeline Server

用来写日志服务数据 , 一般来写与第三方结合的日志服务数据(比如spark等),从官网的介绍看,它是对jobhistoryserver功能的有效补充,jobhistoryserver只能对mapreduce类型的作业信息进行记录,除了jobhistoryserver能够进行对作业运行过程中信息进行记录之外还有更细粒度的信息记录,比如任务在哪个队列中运行,运行任务时设置的用户是哪个用户。根据官网的解释jobhistoryserver只能记录mapreduce应用程序的记录,timelineserver功能更强大,但不是替代jobhistory两者是功能间的互补关系。

3、yarn应用运行原理

YARN 是如何工作的? YARN的基本理念是将JobTracker/TaskTracker 两大职能分割为以下几个实体:1.一个全局的资源管理ResourceManager

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 也归还给系统。

3.2、mapreduce on yarn

4、 yarn使用

4.1 、配置文件

mapreduce.framework.name yarn yarn.nodemanager.aux-services mapreduce_shuffle

4.2、 yarn启动停止

启动 ResourceManager 和 NodeManager (以下分别简称RM、NM)

#主节点运行命令 $HADOOP_HOME/sbin/start-yarn.sh #主节点运行命令 $HADOOP_HOME/sbin/stop-yarn.sh 若RM没有启动起来,可以单独启动

若RM没有启动起来,可以单独启动

#若RM没有启动,在主节点运行命令 $HADOOP_HOME/sbin/yarn-daemon.sh start resouremanager #相反,可单独关闭 $HADOOP_HOME/sbin/yarn-daemon.sh stop resouremanager

若NM没有启动起来,可以单独启动

#若NM没有启动,在相应节点运行命令 $HADOOP_HOME/sbin/yarn-daemon.sh start nodemanager #相反,可单独关闭 $HADOOP_HOME/sbin/yarn-daemon.sh stop nodemanager

4.3、 yarn常用命令

#1.查看正在运行的任务 yarn application -list #2.杀掉正在运行任务 yarn application -kill 任务id #3.查看节点列表 yarn node -list #4.查看节点状况 TODO yarn node -status node3:40652 #5.查看yarn依赖jar的环境变量 yarn classpath

5、Yarn调度器

在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairS cheduler

5.1、 FIFO Scheduler

FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或FairScheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。下面“Yarn调度器对比图”展示了这几个调度器的区别,从图中可以看出,在FIFO 调度器中

5.2、 Capacity Scheduler

而对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。如何配置容量调度器队列层级结构如下:root├── prod└── dev     ├── spark     └── hdpHADOOP_HOME/etc/hadoop/中建立一个新的capacity-scheduler.xml;内容如下:

yarn.scheduler.capacity.root.queues prod,dev yarn.scheduler.capacity.root.dev.queues hdp,spark yarn.scheduler.capacity.root.prod.capacity 40 yarn.scheduler.capacity.root.dev.capacity 60 yarn.scheduler.capacity.root.dev.maximum-capacity 75 yarn.scheduler.capacity.root.dev.hdp.capacity 50 yarn.scheduler.capacity.root.dev.spark.capacity 50

5.3、 Fair Scheduler

在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。需要注意的是,在下图Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成.

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spartan6的特点_Spartan-6系列各型号的逻辑资源
下一篇:聊聊springboot中整合log4g2的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~