FairScheduler/CapacityScheduler
采用层级树的方式,FairScheduler通过这样一棵资源树,维护了整个集群的资源使用情况。资源树中的每一个叶子节点都挂载了此时正在这个队列上运行、或者正在申请运行的应用。FairScheduler只需要对这个树进行适当遍历,就可以知道任何一个资源队列当前有哪些应用在运行、队列当前还剩下多少资源、已经使用多少资源等
###心跳调度
NM通过心跳的方式定期向RM汇报自身状态,
###持续调度
不用等待NodeManager向ResourceManager发送心跳才进行任务调度,而是由一个独立的线程进行实时的资源分配等调度,与NodeManager的心跳出发的调度相互异步并行进行。当心跳到来,只需要把调度结果通过心跳响应告诉对应的NodeManager即可
两种触发机制不同的地方只有两个:
调度时机:心跳调度仅仅发生在收到了某个NodeManager的心跳信息的情况下,持续调度则不依赖与NodeManager的心跳通信,是连续发生的,当心跳到来,会将调度结果直接返回给NodeManager;
调度范围:心跳调度下,当收到某个节点的心跳,就对这个节点且仅仅对这个节点进行一次调度。持续调度的每一轮,是会遍历当前集群的所有节点,每个节点依次进行一次调度,保证一轮下来每个节点都被公平的调度一次
1 | void continuousSchedulingAttempt() throws InterruptedException { |
比较器部分,实际上只是比较了内存
预留资源同非预留资源的区别对待
剥离预留/尝试分配资源
适合在这个节点运行
1 | public enum NodeType { |