Yarn资源调度器之调度器和调度算法

Yarn 调度器和调度算法

目前,Hadoop 作业调度器主要有三种:FIFO、容量(Capacity)和公平(Fair Scheduler)。

Apache Hadoop3.1.3 默认的资源调度器是 Capacity Scheduler

CDH 框架默认调度器是 Fair Scheduler

具体设置详见yarn-default.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>

先进先出调度器(FIFO)

FIFO 调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。

优点:简单易懂

缺点:不支持多队列,生产环境很少使用

容量调度器(Capacity Scheduler)

Capacity Scheduler 是 Yahoo 开发的多用户调度器

多队列:每个队列可配置一定的资源量,每个队列采用 FIFO 调度策略

容量保证:管理员可为每个队列设置资源最低保证和资源使用上限

灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。

多租户:支持多用户共享集群和多应用程序同时运行;为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。

队列资源分配:从 root 开始,使用深度优先算法,优先选择资源占用率最低的队列分配资源

作业资源分配:默认按照提交作业的优先级和提交时间顺序分配资源

容器资源分配:按照容器的优先级分配资源

如果优先级相同,按照数据本地行原则

  • 任务和数据在同一节点
  • 任务和数据在同一机架
  • 任务和数据不在同一节点也不再同一机架

公平调度器(Fair Scheduler)

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

与容量调度器相同点

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

与容量调度器不同点

  • 核心调度策略不同

    容量调度器:优先选择资源利用率低的队列

    公平调度器:优先选择对资源的缺额比例大的

  • 每个队列可以设置单独资源方式

    容量调度器:FIFO、DRF

    公平调度器:FIFO、FAIR、DRF

缺额:某一时刻一个作业应获资源和实际获取资源的差距叫“缺额”

调度器会为缺额大的作业分配资源

FIFO 策略:公平调度器每个队列分配策略如果选择 FIFO 的话,此时公平调度器相当于上面讲过的容量调度器

Fair 策略:默认,是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可得到 1/2 的资源;如果三个程序同时运行,则每个应用程序可得到 1/3 的资源。

具体资源分配流程和容量调度器一致:

  • 选择队列
  • 选择作业
  • 选择容器

以上三步,每一步都是按照公平策略分配资源

  • 实际最小资源份额:mindshare = Min (资源需求量,配置的最小资源)
  • 是否饥饿:isNeedy = 资源使用量 < mindshare (实际最小资源份额)
  • 资源分配比:minShareRatio = 资源使用量 / Max (mindshare,1)
  • 资源使用权重比:useToWeightRatio = 资源使用量 / 权重

DRF 策略

DRF(Dominant Resource Fairness),我们之前说的资源,都是单一标准,例如只考虑内存(也是 Yarn 默认的情况)。但是很多时候我们资源有很多种,例如内存,CPU,网络带宽等,这样我们很难衡量两个应用分配的资源比例。

那么在 Yarn 中,我们用 DRF 来决定如何调度:

假设集群一共有 100CPU 和 10T 内存,那么应用 A 需要(2 CPU,300GB),应用 B 需要(6 CPU,100 GB)。则两个应用分别需要 A(2%CPU,3%内存)和 B(6%CPU,1%内存)的资源,这就意味着 A 是内存主导的,B 是 CPU 主导的,针对这种情况,我们可以选择 DRF 策略对不同的应用进行不同资源(CPU 和内存)的一个不同比例的限制。

posted @ 2021-11-21 10:11  逆十字  阅读(167)  评论(0)    收藏  举报