Yarn

YARN是一个资源管理、任务调度的框架,主要包含三大模块:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。

ResourceManager负责所有资源的监控、分配和管理;

ApplicationMaster负责每一个具体应用程序的调度和协调;

NodeManager负责每一个节点的维护。

ResourceManager

ResourceManager负责整个集群的资源管理和分配,是一个全局的资源管理系统。

NodeManager以心跳的方式向ResourceManager汇报资源使用情况(目前主要是CPU和内存的使用情况)。RM只接受NM的资源汇报信息,对于具体的资源处理则交给NM自己处理。

YARN Scheduler根据application的请求为其分配资源,不负责application job的监控、追踪、运行状态反馈、启动等工作。

NodeManager

NodeManager是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。YARN集群每个节点都运行一个NodeManager。

NodeManager定时向ResourceManager汇报本节点资源(CPU、内存)的使用情况和Container的运行状态。当ResourceManager宕机时NodeManager自动连接RM备用节点。

NodeManager接收并处理来自ApplicationMaster的Container启动、停止等各种请求。

ApplicationMaster

用户提交的每个应用程序均包含一个ApplicationMaster,它可以运行在ResourceManager以外的机器上。

负责与RM调度器协商以获取资源(用Container表示)。

将得到的任务进一步分配给内部的任务(资源的二次分配)。

与NM通信以启动/停止任务。

监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

当前YARN自带了两个ApplicationMaster实现,一个是用于演示AM编写方法的实例程序DistributedShell,它可以申请一定数目的Container以并行运行一个Shell命令或者Shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster。

注:RM只负责监控AM,并在AM运行失败时候启动它。RM不负责AM内部任务的容错,任务的容错由AM完成。

Yarn运行流程

client向RM提交应用程序,其中包括启动该应用的ApplicationMaster的必须信息,例如ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。

ResourceManager启动一个container用于运行ApplicationMaster。

启动中的ApplicationMaster向ResourceManager注册自己,启动成功后与RM保持心跳。

ApplicationMaster向ResourceManager发送请求,申请相应数目的container。

ResourceManager返回ApplicationMaster的申请的containers信息。申请成功的container,由ApplicationMaster进行初始化。container的启动信息初始化后,AM与对应的NodeManager通信,要求NM启动container。AM与NM保持心跳,从而对NM上运行的任务进行监控和管理。

container运行期间,ApplicationMaster对container进行监控。container通过RPC协议向对应的AM汇报自己的进度和状态等信息。

应用运行期间,client直接与AM通信获取应用的状态、进度更新等信息。

应用运行结束后,ApplicationMaster向ResourceManager注销自己,并允许属于它的container被收回。

Yarn调度器Scheduler

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

FIFO Scheduler

FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。

Capacity Scheduler

Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。

Capacityscheduler的特点:

1. 容量保证:可为每个队列设置资源最低量和资源使用上限,所有提交到该队列的应用程序共享该队列中的资源;最小容量不是“总会保证最低容量”,可能会借给其他节点。

调度器总会选择当前资源使用率最低的队列,并为之分配资源。例如同级的队列A1,A2。它们最小容量均为30%。而 A1使用了12%,A2使用了10%,则调度器会优先将资源分给A2。

2.灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列释放的资源会归还给该队列,这种资源灵活分配的方式明显可以提高资源的利用率;

多租户:支持多用户共享集群和多应用程序同时运行,为防止当个应用或者用户或者队列独占集群资源,可为之增加限制,比如设置一个用户或者应用程序可以分配的最大资源数、最大任务运行数;

3.安全保证:每个队列有严格的ACLs列表规定它的访问用户,每个用户可以指定其他哪些用户允许查看自己应用程序的运行状态或者控制应用程序(比如kill);

4.动态更新配置文件:管理员可以根据需要动态更改各种配置参数,以实现在线集群管理。

原文链接:https://blog.csdn.net/Nougats/article/details/71075042

Fair Scheduler

在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。

Fairscheduler的特点:

1. 支持资源抢占,允许调度器杀掉占用超过其应占份额资源队列的containers,这些containers资源便可被分配到应该享有这些份额资源的队列中。

当队列没有任务时,最小资源可以被其他队列抢走;当有新的任务进来时,如果集群有资源则获取资源,如果没有则会从其他低优先级的队列中抢到资源,执行任务。

抢占会降低集群的执行效率,因为被终止的containers需要被重新执行。

通过设置一个全局的参数yarn.scheduler.fair.preemption=true来启用抢占功能。

还有两个参数用来控制抢占的过期时间(这两个参数默认没有配置,需要至少配置一个来允许抢占Container):

- minimum share preemption timeout

- fair share preemption timeout

如果队列在minimum share preemption timeout指定的时间内未获得最小的资源保障,调度器就会抢占containers

2.调度策略配置灵活:允许为每个队列单独设置调度策略(FIFO、Fair或DRF)

3.提高小应用程序响应时间:采用最大最小公平算法,小作业可以快速获取资源并运行完成。

原文链接:https://blog.csdn.net/Nougats/article/details/71075042

三种调度策略对比 :

FIFOScheduler分配资源的顺序和提交应用程序的顺序相同,不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。

CapacityScheduler中,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。

FairScheduler中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。

原文链接:https://blog.csdn.net/Nougats/article/details/71075042

你可能感兴趣的:(Yarn)