EMR 中 YARN 默认使用 CapacityScheduler 调度器,如有使用FairScheduler的需要,可在 EMR页面控制台 > on ECS > 集群名称 > 服务管理 > YARN > 服务参数 > yarn-site.xml中,配置 yarn.resourcemanager.scheduler.class 参数。
<allocations><queue name="root"><minResources>10000 mb,0 vcores</minResources><maxResources>40000 mb,4 vcores</maxResources><weight>1.0</weight><schedulingPolicy>fair</schedulingPolicy></queue></allocations>
这里定义了根队列的最小资源(10000MB 内存和 0 个虚拟核心)、最大资源(40000MB 内存和 4 个虚拟核心)、权重(1.0)以及调度策略为 fair。
在根队列内部,可以添加多个子队列。例如,添加两个子队列 queue1 和 queue2:
<queue name="queue1"><minResources>5000 mb,0 vcores</minResources><maxResources>20000 mb,2 vcores</maxResources><weight>2.0</weight><schedulingPolicy>fair</schedulingPolicy></queue><queue name="queue2"><minResources>3000 mb,0 vcores</minResources><maxResources>15000 mb,1 vcores</maxResources><weight>1.5</weight><schedulingPolicy>fair</schedulingPolicy></queue>
每个子队列都有自己的最小和最大资源限制、权重以及调度策略。权重决定了队列在资源分配中的相对重要性。
如果需要将特定用户的应用程序分配到特定队列,可以配置用户到队列的映射。例如,将用户 user1 的应用程序分配到 queue1,用户 user2 的应用程序分配到 queue2:
<user name="user1"><queue>queue1</queue></user><user name="user2"><queue>queue2</queue></user>
如果希望队列能够在资源不足时抢占其他队列的资源,可以配置抢占策略。例如,允许 queue1 在资源不足时抢占其他队列的资源:
<queue name="queue1"><minResources>5000 mb,0 vcores</minResources><maxResources>20000 mb,2 vcores</maxResources><weight>2.0</weight><schedulingPolicy>fair</schedulingPolicy><queueMaxAMShare>0.5</queueMaxAMShare><fairSharePreemptionTimeout>60000</fairSharePreemptionTimeout><fairSharePreemptionThreshold>0.5</fairSharePreemptionThreshold></queue>
这里的 queueMaxAMShare 表示队列中应用程序的最大资源分配比例,fairSharePreemptionTimeout 表示抢占超时时间(毫秒),fairSharePreemptionThreshold 表示抢占阈值。
<property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value></property><property><name>yarn.scheduler.fair.allocation.file</name><value>/path/to/fair-scheduler.xml</value></property>
确保将 /path/to/fair-scheduler.xml 替换为实际的配置文件路径。