Skip to content

Yarn调度器和调度算法

目前,Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。Apache Hadoop3.3.6默认的资源调度器是Capacity Scheduler。CDH框架默认调度器是Fair Scheduler。

1. 查看默认配置

默认配置在yarn-default.xml文件:yarn.resourcemanager.scheduler.class节点中

xml
<property>
    <description>The class to use as the resource scheduler.</description>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

1. 先进先出调度器(FIFO)

FIFO调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。 优点:简单易懂;
缺点:不支持多队列,生产环境很少使用;

2. 容量调度器(Capacity Scheduler)

2.1 容量调度器特点

Alt text

  1. 多队列:每个队列可配置一定的资源量,每个队列采用FIFO调度策略。
  2. 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
  3. 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
  4. 多租户:支持多用户共享集群和多应用程序同时运行。为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。

2.2 容量调度器资源分配算法

Alt text

  1. 队列资源分配: 从root开始,使用深度优先算法,优先选择资源占用率最低的队列分配资源。
  2. 作业资源分配: 默认按照提交作业的优先级和提交时间顺序分配资源。
  3. 容器资源分配: 按照容器的优先级分配资源;如果优先级相同,按照数据本地性原则(任务和数据在同一节点, 任务和数据在同一机架、任务和数据不在同一节点也不在同一机架)

3. 公平调度器(Fair Scheduler)

Fair Schedulere是Facebook开发的多用户调度器

3.1 公平调度器特点

Alt text

  1. 与容量调度器相同点
    • 多队列:支持多队列多作业
    • 容量保证:管理员可为每个队列设置资源最低保证和资源使用上线
    • 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
    • 多租户:支持多用户共享集群和多应用程序同时运行;为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
  2. 与容量调度器不同点
    • 核心调度策略不同: 容量调度器是优先选择资源利用率低的队列;公平调度器是优先选择对资源的缺额比例大的。
    • 个队列可以单独设置资源分配方式: 容量调度器是FIFO、DRF; 公平调度器是FIFO、FAIR、DRF。

3.2 公平调度器-缺额

Alt text 公平调度器设计目标是:在时间尺度上,所有作业获得公平的资源。某一时刻一个作业应获资源和实际获取资源的差距叫"缺额",调度器会优先为缺额大的作业分配资源

3.3 公平调度器队列资源分配方式

  1. FIFO策略
    公平调度器每个队列资源分配如果选择FIFO的话,此时的公平调度器就是上面所讲的容量调度器。
  2. Fair策略
    Fair策略(默认)是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这意味着,一个队列中有两个应用程序同时运行,则每个应用程序可以得到1/2的资源;如果三个应用程序同时运行,则每个应用程序可以得到1/3的资源。具体调度分配流程和容量调度器一致:
    • 选择队列
    • 选择作业
    • 选择容器

以上每一步都是按照公平策略进行分配资源。
Alt text 上图中计算资源细节如下:
实际最小资源份额: mindshare = Min(资源需求量, 配置的最小资源)
是否饥饿: isNeedy = 资源使用量 < mindshare(实际最小资源份额)
资源分配比: minshareRatio = 资源使用量 / max(mindshare, 1)
资源使用权重比: useTOweightRatio = 资源分配比 / 权重
3. DRF策略
DRF(Dominant Resource Fairness), 我们之前所说的资源都是单一标准,例如只考虑内存(Yarn默认情况下)。但是很多时候我们的资源有很多种,例如内存、CPU、带宽,这样我们很难衡量两个应用应该分配的资源比例。那么在Yarn中,我们用DRF来决定如何调度:
集群一共有100CPU和10T内存,而应用A需要(2CPU,300GB内存),应用B需要(6CPU,100GB内存),则两个应用分别需要A(2%CPU,%3内存),B(6%CPU,%1内存)的资源。这意味这A是内存主导的,B是CPU主导的,正对这种情况,我们可以选择DRF策略对不同应用不同资源(CPU和内存)的一个不同比例的限制。

3.4 公平调度器资源分配算法

Alt text

3.5 公平调度器队列资源分配方式

Alt text