本文档简要概述了 YARN ReservationSystem
。
YARN 的 ReservationSystem
使用户能够预订资源(在时间之前和时间之上),以确保重要生产作业可以非常可预测地运行。ReservationSystem 执行仔细的准入控制,并提供对绝对数量的资源(而不是集群大小的百分比)的保证。预订既可以是可延展的,也可以具有组语义,并且可以具有随时间变化的资源需求。ReservationSystem 是 YARN ResourceManager 的一个组件。
参考上图,典型的预订过程如下
步骤 0 用户(或代表其的自动化工具)提交预订创建请求,并收到包含 ReservationId 的响应。
步骤 1 用户(或代表其的自动化工具)提交由预订定义语言 (RDL) 和从上一步检索的 ReservationId 指定的预订请求。这描述了用户对资源的长期需求(例如,资源的轮廓)和时间约束(例如,截止时间)。这可以通过通常的客户端到 RM 协议或通过 RM 的 REST api 以编程方式完成。如果提交的预订具有相同的 ReservationId,并且 RDL 相同,则不会创建新的预订,并且请求将成功。如果 RDL 不同,则预订将被拒绝,并且请求将失败。
步骤 2 ReservationSystem 利用 ReservationAgent(图中的 GREE)在计划中查找预订的合理分配,计划是一个数据结构,用于跟踪当前接受的所有预订和系统中的可用资源。
步骤 3 SharingPolicy 提供一种方法来强制执行对被接受预订的不变量,可能会拒绝预订。例如,CapacityOvertimePolicy 允许强制执行用户在其所有预订中可以请求的瞬时最大容量以及一段时间内资源积分的限制,例如,用户可以立即预订最多 50% 的集群容量,但在任何 24 小时内,他/她都不能超过 10% 的平均值。
步骤 4 在成功验证后,ReservationSystem 向用户返回 ReservationId(可以将其视为机票)。
步骤 5 当时间到来时,一个名为 PlanFollower 的新组件通过动态创建/调整/销毁队列将计划的状态发布到调度程序。
步骤 6 然后,用户可以通过将 ReservationId 包含在 ApplicationSubmissionContext 中,向可预订队列提交一个(或多个)作业。
步骤 7 然后,调度程序将从一个特殊队列中提供容器,该队列旨在确保尊重资源预订。在预订的限制范围内,用户可以保证访问资源,在该资源之上,资源共享将继续进行标准容量/公平共享。
步骤 8 该系统包括适应集群容量下降的机制。这包括在可能的情况下通过“移动”预订或拒绝最少数量的先前接受预订(以确保其他预订将收到其全部数量)来重新规划。
配置 ReservationSystem
很简单。目前,我们已在 CapacityScheduler
和 FairScheduler
中添加了对预订的支持。您可以在 capacity-scheduler.xml 或 fair-scheduler.xml 中将任何叶队列标记为可用于“预订”(有关详细信息,请参阅 CapacityScheduler 和 FairScheduler)。然后,该队列中的容量/公平份额可用于进行预订。仍然可以在没有预订的情况下将作业提交给可预订队列,在这种情况下,它们将在活动预订中运行的作业留下的任何容量中以尽力模式运行。