调度框架学习笔记(1)—— 概述
1.1 什么是调度
通常所说的调度(schedule
)是和时间有关的。
1.1.1 单 CPU 的时间片调度
时间作为唯一的不可逆转的资源,一般是划分为多个时间片来使用。就计算机而言,由于 CPU
的速度快的多,所以就有了针对 CPU
时间片的调度,让多个任务在同一个 CPU
上运行起来。某一时刻CPU还是单任务运行的。
1.1.2 多 CPU 协作
为了在同一时间运行更多的任务,或者多个处理器一起工作完成一个任务目标,就需要一个协调者——这就成为一个分布式系统,就单个数据中心或者小范围来说,这就是集群。
1.1.3 资源调度
如果让一个分布式系统运行多个任务,每个任务对分布式系统中的资源必然产生竞争,时间调度就发展到资源调度。被调度的资源指的是,内存、CPU
、网络资源、磁盘 I/O
。
集群资源管理系统是对底层硬件的进一步抽象,它屏蔽了硬件的异构性,对上层各种应用提供资源统一管理和调度。从当前公认的云计算划分看,它属于IAAS(Infrastructure-as-a- Service)。
1.2 为啥要做资源调度
1.2.1 资源调度目的
通过一定策略把资源分配给用户提交到系统里的各种任务。在计算机中资源管理与调度是根据具体场景而设定的,其实终极目的都是为了使资源分配的更加合理。
1.2.2 资源调度意义
调度直接影响到运行集群的开销,好的资源调度框架,可以大大提高资源利用率,降低运营成本。一个糟糕的调度框架会导致集群的资源利用率很低,那些昂贵的机器资源则会白白浪费。
1.3 如何调度(策略)
也就是调度(负载均衡)算法,以下是几个常见的调度策略。
1.3.1 FIFO Scheduler
将所有的 Job
放到队列中,先按照作业的优先级高低、再按照到达时间的先后,为每个 Job
分配资源。如果第一个 Job
需要的资源被满足了,如果还剩下了资源并且满足第二个 Job
需要的资源,那么就为第二个 Job
分配资源,以此类推。
- 优点:简单,不需要配置。
- 缺点:不适合共享集群。如果有大的
Job
需要很多资源,那么其他Job
可能会一直等待。
1.3.2 Capacity Scheduler
Capacity Scheduler
用于一个集群(集群被多个组织共享)中运行多个 Job
的情况,目标是最大化吞吐量和集群利用率。
Capacity Scheduler
允许将整个集群的资源分成多个部分,每个组织使用其中的一部分,即每个组织有一个专门的队列,每个组织的队列还可以进一步划分成层次结构,从而允许组织内部的不同用户组的使用。每个队列内部,按照 FIFO
的方式调度 Job
。当某个队列的资源空闲时,可以将它的剩余资源共享给其他队列。
1.3.3 Fair Scheduler
当集群中只有一个 Job
时,它独占集群资源。当有新的 Job
提交时,空闲的资源被新的 Job
使用,这样最终每个 Job
就会得到大约相同的资源。可以为不同的 Job
设置优先级,决定每个 Job
占用的资源百分比。Fair Scheduler
可以让短的作业在合理的时间内完成,而不必一直等待长作业的完成。
附录:参考资料
YARN中FIFO、Capacity以及Fari调度器的详细介绍