[TOC]
Yarn的调度流程详解
-
Client端提交作业到ResourceManager中的ApplicationManager,申请JobID(唯一ID)
-
RM返回一个作业ID,并且将一个临时hdfs路径返回给 Client,要求Client将要上传的文件发送到这个临时目录中。(任务结束后,该临时目录将被删除)
-
Client将作业运行所需要的资源(jar包、配置文件和分片信息等)向指定的HDFS路径上传
-
上传成功后,向RM中的AM发送请求,执行作业
-
AM将请求转发给调度器,调度器开始处理请求
-
调度器将任务放置队列中,当执行到请求的时候,则告知ApplicationManager 可以分配容器,告知NodeManager的信息用于开辟Container
-
ApplicationManager命令NodeManager创建一个Container并运行作业的ApplicationMaster。NodeManager创建一个Container并启动作业的ApplicationMaster。ApplicationMaster将自己注册到ApplicationManager,使得ApplicationManager可以监控到Job的执行状态,Client也可以通过ApplicationManager对作业进行控制。
-
ApplicationMaster查询临时hdfs路径,获取jar包信息,配置文件等,创建map和reduce任务
-
ApplicationMaster请求调度器分配资源,开辟map,reduce任务资源
-
调度器返回执行信息,内含在哪些NodeManager可开辟资源信息
-
ApplicationMaster通知NodeManager开辟资源池启动map和reduce任务
-
NodeManager 启动自身资源池中的任务
-
map、reduce任务查询临时hdfs路径的数据。开始执行。ApplicationMaster实时监控自己管理的map、reduce任务执行情况,如果失败,请求调度器在新节点中开辟资源池,执行失败的程序。ApplicationManager实时监控自己管理的ApplicationMaster执行情况,如果ApplicationMaster 宕机,创建一个新的ApplicationMaster,继续监控原有的map和reduce任务,在此期间,map、reduce任务不受影响
-
程序成功,释放资源
Yarn的调度策略
- FIFO调度
- 容量调度
- 公平调度
1.FIFO先进先出调度
这种调度最简单,将应用放置在一个队列中,然后按照提交的顺序将所有的Applications放到队列中,先按照作业的优先级高低、再按照到达时间的先后,为每个app分配资源。如果第一个app需要的资源被满足了,如果还剩下了资源并且满足第二个app需要的资源,那么就为第二个app分配资源。
优点:简单,不需要配置。
缺点:不适合共享集群。如果有大的app需要很多资源,那么其他app可能会一直等待。
2.Capacity 容量调度机制
容量调度机制适用于一个集群(集群被多个组织共享)中运行多个Application的情况,目标是最大化吞吐量和集群利用率。
容量调度允许将整个集群的资源分成多个部分,每个组织使用其中的一部分,即每个组织有一个专门的队列,每个组织的队列还可以进一步划分成层次结构(Hierarchical Queues),从而允许组织内部的不同用户组的使用。
每个队列内部,按照FIFO的方式调度Applications。当某个队列的资源空闲时,可以将它的剩余资源共享给其他队列。
实例:
有一个专门的队列允许小的apps提交之后能够尽快执行,job1先提交到queueA,并没有占用系统的全部资源(假如job1需要100G内存,但是整个集群只有100G内存,那么只分配给job1 80G),job2可提交到queueB 中快速执行。
3.Fair 公平调度机制
FairScheduler允许应用在一个集群中公平地共享资源。默认情况下FairScheduler的公平调度只基于内存,也可以配置成基于memory & CPU。当集群中只有一个app时,它独占集群资源。当有新的app提交时,空闲的资源被新的app使用,这样最终每个app就会得到大约相同的资源。可以为不同的app设置优先级,决定每个app占用的资源百分比。FairScheduler可以让短的作业在合理的时间内完成,而不必一直等待长作业的完成。
Fair Sharing: Scheduler将apps组织成queues,将资源在这些queues之间公平分配。默认情况下,所有的apps都加入到名字为“default“的队列中。app也可以指定要加入哪个队列中。队列内部的默认调度策略是基于内存的共享策略,也可以配置成FIFO和multi-resource with Dominant Resource Fairness
Minimum Sharing:FairScheduller提供公平共享,还允许指定minimum shares to queues,从而保证所有的用户以及Apps都能得到足够的资源。如果有的app用不了指定的minimum的资源,那么可以将超出的资源分给别的app使用。
FairScheduler默认让所有的apps都运行,但是也可以通过配置文件配置每个queue中的分配权重,若权重1:1,当两个queue同时执行任务时,各分到一半资源。
实例:
两个用户A和B。A提交job1时集群内没有正在运行的app,因此job1独占集群中的资源。用户B的job2提交时,job2在job1释放一半的containers之后,开始执行。job2还没执行完的时候,用户B提交了job3,job2释放它占用的一半containers之后,job3获得资源开始执行。