Github user mateiz commented on a diff in the pull request:
https://github.com/apache/spark/pull/1313#discussion_r15508212
--- Diff:
core/src/main/scala/org/apache/spark/scheduler/TaskSchedulerImpl.scala ---
@@ -246,28 +246,36 @@ private[spark] class TaskSchedulerImpl(
// Take each TaskSet in our scheduling order, and then offer it each
node in increasing order
// of locality levels so that it gets a chance to launch local tasks
on all of them.
+ // NOTE: the preferredLocality order: PROCESS_LOCAL, NODE_LOCAL,
NOPREF, RACK_local, ANY
var launchedTask = false
- for (taskSet <- sortedTaskSets; maxLocality <-
taskSet.myLocalityLevels) {
- do {
- launchedTask = false
- for (i <- 0 until shuffledOffers.size) {
- val execId = shuffledOffers(i).executorId
- val host = shuffledOffers(i).host
- if (availableCpus(i) >= CPUS_PER_TASK) {
- for (task <- taskSet.resourceOffer(execId, host, maxLocality))
{
- tasks(i) += task
- val tid = task.taskId
- taskIdToTaskSetId(tid) = taskSet.taskSet.id
- taskIdToExecutorId(tid) = execId
- activeExecutorIds += execId
- executorsByHost(host) += execId
- availableCpus(i) -= CPUS_PER_TASK
- assert (availableCpus(i) >= 0)
- launchedTask = true
+ for (taskSet <- sortedTaskSets; preferredLocality <-
taskSet.myLocalityLevels) {
+ def launchTaskOnLocalityLevel(locality: TaskLocality.Value) {
+ do {
+ launchedTask = false
+ for (i <- 0 until shuffledOffers.size) {
+ val execId = shuffledOffers(i).executorId
+ val host = shuffledOffers(i).host
+ if (availableCpus(i) >= CPUS_PER_TASK) {
+ for (task <- taskSet.resourceOffer(execId, host, locality)) {
+ tasks(i) += task
+ val tid = task.taskId
+ taskIdToTaskSetId(tid) = taskSet.taskSet.id
+ taskIdToExecutorId(tid) = execId
+ activeExecutorIds += execId
+ executorsByHost(host) += execId
+ availableCpus(i) -= CPUS_PER_TASK
+ assert(availableCpus(i) >= 0)
+ launchedTask = true
+ }
}
}
- }
- } while (launchedTask)
+ } while (launchedTask)
+ }
+ launchTaskOnLocalityLevel(preferredLocality)
+ // search noPref task after we have launched all node_local and
nearer tasks
+ if (preferredLocality == TaskLocality.NODE_LOCAL) {
+ launchTaskOnLocalityLevel(TaskLocality.NOPREF)
+ }
--- End diff --
Instead of modifying the code here, make taskSet.myLocalityLevels include
NO_PREFS in its list if it has tasks with no preferences. IMO that makes this
logic even simpler.
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---