EMR 中 YARN 默认使用 Capacity Scheduler 调度器,并为您提供了便捷的界面化的队列管理配置能力,您也可使用命令方式更灵活地进行 Capacity Scheduler 调度器的队列配置,本文为您介绍Capacity Scheduler 调度器的队列配置详情。
EMR YARN 队列支持 Capacity Scheduler(默认)、Fair Scheduler 两类调度器,可满足不同场景下资源分配与调度的诉求,两类调度器对比介绍如下。
对比维度 | CapacityScheduler | FairScheduler |
|---|---|---|
核心目标 | 保证各队列获得预设容量 | 让活跃队列或作业逐步获得公平份额 |
资源配置方式 | 主要按容量比例或绝对资源配置,如队列占 30% | 主要配置最小/最大资源和权重 |
空闲资源 | 队列可临时借用其他队列未使用的资源,但受最大容量限制 | 空闲资源会动态分给有任务的队列 |
资源竞争 | 更强调组织间的容量保障和隔离 | 更强调共享集群时的动态公平 |
抢占逻辑 | 可通过抢占机制收回超出保障份额的资源 | 可在队列长期低于公平份额时触发抢占 |
配置文件 | capacity-scheduler.xml | fair-scheduler.xml |
典型场景 | 多部门、多租户,资源预算和配额相对明确 | 多用户共享集群,任务量变化明显,希望减少小任务等待 |
EMR 默认情况 | EMR 中 YARN 默认使用 | 需要修改调度器配置并部署 Fair 队列文件 |
本文为您介绍 Capacity Scheduler 调度器的队列资源与调度规则的配置详情,当前支持在 EMR 控制台界面进行配置,也可登录 YARN 服务器通过配置文件来进行设置。
说明
如果您希望使用 Fair Scheduler 调度器,可手动将调度器切换为 Fair Scheduler,并进行设置,详情请参见队列管理:Fair Scheduler。
EMR 控制台提供了可视化的 YARN 队列管理功能,支持新增队列、修改队列配置、调整队列层级、启停队列等操作。
队列管理包含以下两个页签:
在队列管理页面的 队列配置 页签中,单击右上方的 添加队列,在弹出的侧边框中配置队列参数。
新增子队列时,默认父级队列为 root 队列,您可按需单击添加队列为 root 父队列添加更多子队列,并调整所有子队列的容量占比等参数,子队列的核心配置参数如下。
参数 | 说明 |
|---|---|
容量占比(%) | 队列的容量占比。同一父队列下所有子队列的容量占比之和必须为 100。 |
最大容量占比(%) | 存在空闲资源时,允许队列使用超过其容量占比的资源,最高不超过最大容量占比。该值不得小于容量占比。 |
状态 | 控制子队列是否启用。 |
配置完成后,单击 确定 完成子队列添加。
您可以在队列管理页面查看 YARN 队列的队列列表,对于子队列,您可单击 修改 按钮,编辑修改队列的 容量参数、状态等;也可为 root 父级队列添加新的子队列。
潮汐调度规则适用于集群资源需求随时间周期性变化的场景。您可以根据业务高峰和低峰分别配置调度规则,例如早上 8 点提高分析师任务队列的资源占比,晚上 8 点再调整为离线任务优先,通过潮汐调度规则在指定时间自动切换 YARN 子队列的资源分配策略,减少人工操作,并提升集群资源利用率和业务高峰期的资源保障能力。
在队列管理页面的 调度规则 页签中,单击右上方的 添加规则,在弹出的侧边框中配置队列参数。
参数 | 说明 |
|---|---|
规则名称 | 自定义调度规则的名称,用于后续查询、标识。 |
队列配置 | 设置当前调度规则适用的队列,您可在下拉框中选择已有的子队列,并设置当前调度规则下,对应子队列的容量占比(%)、最大容量占比(%)。
|
Cron 表达式 | 使用 Cron 表达式设置调度执行周期。
|
操作备注 | 为当前调度规则添加操作备注。 |
完成配置后,单击 添加,完成调度规则配置。
您可按需配置多个调度规则。
您可以在调度规则页面查看已添加的调度规则列表。
YARN 队列是树状组织的,所有队列都是 root 队列的子队列,队列路径表示队列的层级关系,不同层级间通过.进行分隔。集群所有资源都挂在 root 队列下,子队列可以根据配置划分父队列的资源(不指定划分默认可以共用父队列的资源)
可以通过以下配置设置队列。
<property> <name>yarn.scheduler.capacity.root.queues</name> <value>a,b,c</value> #设置root队列下有三个子队列,分别为root.a,root.b和root.c,可以共用root 队列的总资源 <description>The queues at the this level (root is the root queue). </description> </property> <property> <name>yarn.scheduler.capacity.root.a.queues</name> <value>a1,a2</value> # root.a队列下又划分两个子队列,分别问root.a.a1和root.a.a2 <description>The queues at the this level (root is the root queue). </description> </property> <property> <name>yarn.scheduler.capacity.root.b.queues</name> <value>b1,b2,b3</value> # root.b.b1,roor.b.b2,root.b.b3 <description>The queues at the this level (root is the root queue). </description> </property>
对于每个队列路径,例如 root.a.a1,可以在配置文件中配置队列用量的基本属性
参数 | 说明 |
|---|---|
yarn.scheduler.capacity..capacity | 队列容量,浮点数,表示队列的最小容量( YARN 保证该队列可获取的资源)。一旦配置,要保证该队列的父队列下所有子队列的加和恰好为 100,否则会出现错误。运行过程中,该队列中的应用资源用量可能超过配置的最小容量(其余子队列中有空余资源,为保证资源利用率,可以暂时使用其余子队列的资源)。 |
yarn.scheduler.capacity..maximum-capacity | 队列最大用量,浮点数,表示队列最多使用的资源。配置有效值在 0-100 之间,也可以设置 -1 代表 100%,需要保证该队列的父队列下所有子队列的加和大于等于 100,否则会出现部分资源无法使用的问题。 |
yarn.scheduler.capacity..maximum-allocation-vcores | 队列中应用最大可申请的 vcores 数量。 |
yarn.scheduler.capacity..maximum-allocation-mb | 队列中应用最大可申请的内存大小。 |
yarn.scheduler.capacity..user-settings..weight | 按user分配队列中资源使用的比重,比重越大的 user 越容易申请到资源。 |
更多参数 | 可参考开源配置参数说明文档 |
除按比例配置队列容量,还可以使用yarn.scheduler.capacity.<queue-path>.capacity和yarn.scheduler.capacity.<queue-path>.max-capacity配置绝对容量,比如[memory=10240,vcores=12]。
还可通过配置限定队列中的作业数量
参数 | 说明 |
|---|---|
yarn.scheduler.capacity.maximum-applications | 队列中可运行的最大作业数量,全局配置,默认为10000。到达该数量后继续向同一队列提交作业会被拒绝。 |
yarn.scheduler.capacity..maximum-applications | 特定队列中可运行的最大作业数量。 |
yarn.scheduler.capacity.maximum-am-resource-percent | 队列中 ApplicationMaster 资源占用最大比例,全局配置,有效值0-1之间,默认是0.1。 |
yarn.scheduler.capacity..maximum-am-resource-percent | 特定队列中 ApplicationMaster 资源占用最大比例。 |
yarn.scheduler.capacity.max-parallel-apps | 队列中可同时运行的最大作业数量,全局配置,与maximum-applications的不同是,达到该数量之后继续提交的作业不会被拒绝,而是会停留在 ACCEPTED 状态等待。 |
yarn.scheduler.capacity..max-parallel-apps | 特定队列中可同时运行的最大作业数量。 |
更多队列基本设置可参照 开源参数配置说明文档。
YARN 队列支持为用户设置特定的访问权限,特定队列的访问权限分为两种:提交作业权限和队列管理权限。
开启队列权限需要在 yarn-site 中设置 yarn.acl.enable 为 true(若 yarn 开启 ranger 权限管控则该配置默认为 true,但该种情况建议使用 ranger 管理 YARN 的队列权限,不建议再重复设置)。
可通过设置 yarn.admin.acl 来指定特定用户拥有 YARN admin 的操作权限,默认为 yarn 用户。用户的设置逻辑为:
*表示任意用户都有该权限设置特定队列的权限:
参数 | 说明 |
|---|---|
yarn.scheduler.capacity.root..acl_submit_applications | 设置拥有该队列提交作业权限的用户。 |
yarn.scheduler.capacity.root..acl_administer_queue | 设置拥有该队列管理权限的用户。 |
Yarn 支持任务抢占。任务抢占分为队列间抢占和队列内抢占,其中队列间的抢占默认开启。如果要配置抢占,需要在 yarn-site.xml 里打开抢占功能,并在 capacity-scheduler.xml 里做具体配置。
yarn-site.xml
参数 | 说明 |
|---|---|
yarn.resourcemanager.scheduler.monitor.enable | 是否打开抢占功能,默认 false |
capacity-scheduler.xml
参数 | 说明 |
|---|---|
yarn.resourcemanager.monitor.capacity.preemption.intra-queue-preemption.enabled | 是否打开队列内抢占,默认 false |
yarn.resourcemanager.monitor.capacity.preemption.intra-queue-preemption.preemption-order-policy | 应用的排序策略,分为 userlimit_first 和 priority_first,前者为用户配额抢占,后者为优先级抢占。默认 userlimit_first |
yarn.scheduler.capacity..disable_preemption | 指定队列不可被抢占,默认继承上层队列设置的值。 |
yarn.scheduler.capacity..intra-queue-preemption.disable_preemption | 指定队列不支持队列内抢占,默认继承上层队列设置的值。 |