YARN 资源调度三种模型介绍
1) 双层资源调度模型
YARN 使用了双层资源调度模型。
第一层:ResourceManager 中的调度器将资源分配给各个 ApplicationMaster。这一层调度由 YARN 的资源调度器来实现。
第二层:ApplicationMaster 再进一步将资源分配给它内部的各个任务。这一层的调度由用户程序这个计算框架来实现。
YARN 的资源分配过程是异步的,YARN 的调度器分配给 AM 资源后,先将资源存入一个缓冲区内,当 AM 下次心跳时来领取资源。
资源分配过程如下 7 个步骤:
步骤 1:NodeManager 通过周期性的心跳汇报节点信息 : 告诉 resourceManager 当前剩余的资源信息
步骤 2:RM 为 NM 返回一个应答,包括要释放的 Container 列表。
步骤 3:RM 收到 NM 汇报的信息后,会出发资源调度器的 Node_Update 事件。
步骤 4:资源调度器收到 Node_Update 事件后,会按照一定的策略将该节点上资源分配给各个应用程序,并将分配结果存入一个内存数据结构中。
步骤 5:应用程序的 ApplicationMaster 周期性地向 RM 发送心跳,以领取最新分配的 Container。
步骤 6:RM 收到 AM 的心跳后,将分配给它的 Container 以心跳应答的方式返回给 ApplicationMaster
步骤 7:AM 收到新分配的 Container 后,会将这些 Container 进一步分配给他的内部子任务
2) 资源保证机制
YARN 采用增量资源分配机制来保证资源的分配。
增量资源分配机制是指当 YARN 暂时不能满足应用程序的资源要求时,将现有的一个节点上的资源预留,等到这个节点上累计释放的资源满足了要求,再分配给 ApplicationMaster。
这种增量资源分配机制虽然会造成资源的浪费,但是能保证 AM 肯定会得到资源,不会被饿死。
3) 资源分配算法
YARN 的资源调度器采用了主资源公平调度算法(DRF)来支持多维度资源调度。
4) 资源抢占模型
资源调度器中,每个队列可以设置一个最小资源量和最大资源量。为了提高集群使用效率,资源调度器会将负载较轻的队列资源分配给负载较重的队列使用,当负载较轻的队列突然接到了新的任务时,调度器才会将本属于该队列的资源分配给它,但是此时资源有可能正被其他队列使用,因此调度器必须等待其他队列释放资源,如果一段时间后发现资源还未得到释放,则进行资源抢占。
关于资源抢占的实现,涉及到一下两个问题:a.如何决定是否抢占某个队列的资源 b. 如何使得资源抢占代价最小
资源抢占是通过杀死正在使用的 Container 实现的,由于 Container 已经处于运行状态,直接杀死 Container 会造成已经完成的计算白白浪费,为了尽可能地避免资源浪费,YARN 优先选择优先级低的 Container 做为资源抢占的对象,并且不会立刻杀死 Container,而是将释放资源的任务留给 ApplicationMaster 中的应用程序,以期望他能采取一定的措施来执行释放这些 Container,比如保存一些状态后退出,如果一段时间后,ApplicationMaster 仍未主动杀死 Container,则 RM 再强制杀死这些 Container
评论