spark 笔记 11: SchedulingAlgorithm 两种调度算法的优先级比较

调度算法的最基本工作之一,就是比较两个可执行的task的优先级。spark提供的FIFO和FAIR的优先级比较 SchedulingAlgorithm这个接口体现。  
FIFO:
  1. --计算优先级的差。注意,在程序中,大部分时候是优先级的数字越小,它优先级越高
  2. --如果优先级相同,那么stage编号越靠前,优先级越高
  3. --如果优先级字段和stage id都相同,那么s2比s1更优先。(有这种情况?)
FAIR:
  1. --没有达到最小资源的task比已经达到最小资源的task优先级高
  2. --如果两个task都没达到最小资源,那么比较它们占用最小资源的比例。比例越小越优先
  3. --否则比较占用权重资源的比例,比例越小越优先
  4. --如果所有上述的比较都相同,那么名字小的优先(哈哈,名字很重要);
  5. --名字相同,则s2优先级高。

/**
* An interface for sort algorithm
* FIFO: FIFO algorithm between TaskSetManagers
* FS: FS algorithm between Pools, and FIFO or FS within Pools
*/
private[spark] trait SchedulingAlgorithm {
def comparator(s1: Schedulable, s2: Schedulable): Boolean
}

private[spark] class FIFOSchedulingAlgorithm extends SchedulingAlgorithm {
override def comparator(s1: Schedulable, s2: Schedulable): Boolean = {
val priority1 = s1.priority
val priority2 = s2.priority
var res = math.signum(priority1 - priority2) --计算优先级的差。注意,在程序中,大部分时候是优先级的数字越小,它优先级越高
 
  if (res == 0) {
val stageId1 = s1.stageId
val stageId2 = s2.stageId
res = math.signum(stageId1 - stageId2) --如果优先级相同,那么stage编号越靠前,优先级越高。
}
if (res < 0) {
true
} else {
false ---如果优先级字段和stage id都相同,那么s2比s1更优先。(有这种情况?)
}
}
}



private[spark] class FairSchedulingAlgorithm extends SchedulingAlgorithm {
override def comparator(s1: Schedulable , s2: Schedulable): Boolean = {
val minShare1 = s1.minShare
val minShare2 = s2.minShare
val runningTasks1 = s1.runningTasks
val runningTasks2 = s2.runningTasks
val s1Needy = runningTasks1 < minShare1
val s2Needy = runningTasks2 < minShare2
val minShareRatio1 = runningTasks1.toDouble / math. max(minShare1 , 1.0).toDouble
val minShareRatio2 = runningTasks2.toDouble / math. max(minShare2 , 1.0).toDouble
val taskToWeightRatio1 = runningTasks1.toDouble / s1.weight.toDouble
val taskToWeightRatio2 = runningTasks2.toDouble / s2.weight.toDouble
var compare: Int = 0

if (s1Needy && !s2Needy) { ----没有达到最小资源的task比已经达到最小资源的task优先级高
return true
} else if (!s1Needy && s2Needy) { ----没有达到最小资源的task比已经达到最小资源的task优先级高
return false
} else if (s1Needy && s2Needy) { ---如果两个task都没达到最小资源,那么比较它们占用最小资源的比例。比例越小越优先
compare = minShareRatio1.compareTo(minShareRatio2)
} else { ---否则比较占用权重资源的比例,比例越小越优先
compare = taskToWeightRatio1.compareTo(taskToWeightRatio2)
}

if (compare < 0) {
true
} else if (compare > 0) {
false
} else { ----如果所有上述的比较都相同,那么名字小的优先(哈哈,名字很重要);名字相同,则s2优先级高。
s1.name < s2.name
}
}
}




posted on 2015-01-25 00:35 过雁 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/zwCHAN/p/4246920.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值