一、前言
最近要升级 CDH
集群成 CDP
集群,CDH
集群中 Yarn
服务默认使用的是 fair
调度器,CDP
集群使用的是 capacity
调度器,我们之前淌过 调度器因为批量分配设置不合理,导致任务集中分配到了某几台节点,使集群资源负载极度不均衡。
为了避免同样的问题出现在 CDP
集群上,我们提前进行调研。看看使用 调度器会不会也有集中分配的现象。但是调研过程中,出现了一些不和预期的现象,等待后续跟进。
二、CDH集中分配
前面介绍过,CDH 5.8-Hadoop2.6.0
版本后,针对公平调度
,有如下几个配置,来针对任务类型(小任务)加快分配的优化。
配置名 | 解释 |
---|---|
yarn.scheduler.fair.max.assign | 最大分配数:如果 assignmultiple 为 true 且 dynamic.max.assign 为 false,则一个心跳中可以分配的最大容器数。 |
yarn.scheduler.fair.assignmultiple | 分配多个:是否允许在一个心跳中分配多个容器。 |
yarn.scheduler.fair.dynamic.max.assign | 如果assignmultiple为真,是否动态确定一个心跳可以分配的资源量。开启后,节点上大约一半的未分配资源会在一次心跳中分配给容器。默认为真。 |
通过合理的配置,我们就可以即使用集中分配的方式,又不会扩大集群负载差异。
CDH
集群如何配置这里不展开介绍。
三、CDP集中分配
CDP 集群中已经使用容量调度
来作为默认的调度器,通过查阅官方和Cloudera 文件,发现 调度也是有通过心跳为 NodeManager
分配多个容器。相关配置如下:
配置名 | 解释 |
---|---|
yarn.scheduler.capacity.per-node-heartbeat.multiple-assignments-enabled | 是否允许在一个 NodeManager 心跳中分配多个容器。默认为真。 |
yarn.scheduler.capacity.per-node-heartbeat.maximum-container-assignments | 如果multiple-assignments-enabled 为 true ,则在一个 NodeManager 心跳中可以分配的最大容器数量。默认为 -1,不设置限制。 |
yarn.scheduler.capacity.per-node-heartbeat.maximum-offswitch-assignments | 如果multiple-assignments-enabled 为 true ,则在一个 NodeManager 心跳中可以分配的最大 off-switch 容器数量。默认为 1,表示一个心跳中只允许一个关闭开关分配。 |
如何配置
-
在
Cloudera Manager
中,选择集群 >YARN 队列管理器 UI 服务
。
-
在
YARN
队列管理器窗口中,单击调度程序配置选项卡。
-
在“调度程序配置”窗口中
-
选中
Enable Multiple Assignments Per Heartbeat
复选框以允许在一个NodeManager
心跳中分配多个容器 -
配置以下
NodeManager
心跳属性:
Maximum Container Assignments Per Heartbeat
: 在一个NodeManager
心跳中可以分配的最大容器数。将此值设置为 -1 将禁用此限制。Maximum Off-Switch Assignments Per Heartbeat
: 可以在一个NodeManager
心跳中分配的关闭开关容器的最大数量。
三、总结
capacity
调度器也有类似fair
调度器的心跳批量分配配置。- CDP 集群
capacity
调度器默认开启了批量分配,并且分配数量为 100,这个值需要调小。 - 目前测试下来,发现配置好像没有生效,这个需要后续联系专家跟进下。
后续
这里贴一下后续,CDP默认配置是把container
尽量分配到多个节点的. 这主要是因为CDP默认启用了 Asynchronous Scheduling
, 不用等NM的心跳分配container
. 如果需要测试集中分配的场景, 可以把Asynchronous Scheduling
关闭:
CM -> YARN QM -> Scheduler Configuration -> Asynchronous Scheduling
不勾选
然后需要重启ResourceManager
是设置生效.
还有一点需要注意的是, 很多时候, App请求的container
是off-switch
的(也就是不在意 data locality), 比如spark Pi
程序的场景, Spark请求的都是off-switch
的container
, 为了验证集中分配的效果, 我们还需要把 YARN QM 中的 Maximum Off-Switch Assignments Per Heartbeat
调大, 就能看到效果了.
参考
https://docs.cloudera.com/cdp-private-cloud-base/7.1.7/yarn-allocate-resources/topics/yarn-set-user-limits.html
https://docs.cloudera.com/cdp-private-cloud-base/7.1.7/yarn-allocate-resources/topics/yarn-configure-nm-heartbeat.html
https://hadoop.apache.org/docs/r3.1.1/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html#Reviewing_the_configuration_of_the_CapacityScheduler