标题“地点级别”和5状态数据的含义是什么 本地 - >过程本地 - > node local - > rack local - >任何?
答案 0 :(得分:44)
据我所知,位置级别表示已执行哪种类型的数据访问。当节点完成其所有工作并且其CPU变为空闲时,Spark可能决定启动其他需要从其他位置获取数据的待处理任务。理想情况下,所有任务都应该是本地进程,因为它与较低的数据访问延迟相关联。
您可以使用以下命令配置等待时间,然后再转到其他位置级别:
spark.locality.wait
有关参数的更多信息,请参阅Spark Configuration docs
关于不同级别PROCESS_LOCAL,NODE_LOCAL,RACK_LOCAL或ANY,我认为 org.apache.spark.scheduler中的方法 findTask 和 findSpeculativeTask 。 TaskSetManager 说明Spark如何根据其位置级别选择任务。它首先检查将在同一执行程序进程中启动的PROCESS_LOCAL任务。如果没有,它将检查可能在同一节点中的其他执行程序中的NODE_LOCAL任务,或者需要从HDFS,缓存等系统中检索NACKE_LOCAL任务.RACK_LOCAL表示数据在另一个节点中,因此需要先传输执行。最后,ANY只是承担可能在当前节点中运行的任何待处理任务。
/**
* Dequeue a pending task for a given node and return its index and locality level.
* Only search for tasks matching the given locality constraint.
*/
private def findTask(execId: String, host: String, locality: TaskLocality.Value)
: Option[(Int, TaskLocality.Value)] =
{
for (index <- findTaskFromList(execId, getPendingTasksForExecutor(execId))) {
return Some((index, TaskLocality.PROCESS_LOCAL))
}
if (TaskLocality.isAllowed(locality, TaskLocality.NODE_LOCAL)) {
for (index <- findTaskFromList(execId, getPendingTasksForHost(host))) {
return Some((index, TaskLocality.NODE_LOCAL))
}
}
if (TaskLocality.isAllowed(locality, TaskLocality.RACK_LOCAL)) {
for {
rack <- sched.getRackForHost(host)
index <- findTaskFromList(execId, getPendingTasksForRack(rack))
} {
return Some((index, TaskLocality.RACK_LOCAL))
}
}
// Look for no-pref tasks after rack-local tasks since they can run anywhere.
for (index <- findTaskFromList(execId, pendingTasksWithNoPrefs)) {
return Some((index, TaskLocality.PROCESS_LOCAL))
}
if (TaskLocality.isAllowed(locality, TaskLocality.ANY)) {
for (index <- findTaskFromList(execId, allPendingTasks)) {
return Some((index, TaskLocality.ANY))
}
}
// Finally, if all else has failed, find a speculative task
findSpeculativeTask(execId, host, locality)
}
答案 1 :(得分:1)
这是我的两分钱,我的总结主要来自spark official guide。
首先,我想添加一个NO_PREF
这样的局部性级别,该级别已在this thread中进行了讨论。
然后,让我们将这些级别放到一个表中,
请注意,可以根据spark configuration中的指南跳过特定级别。
例如,如果要跳过NODE_LOCAL
,只需将spark.locality.wait.node
设置为0。