什么是" Locality Level"在Spark集群上的含义

时间:2014-11-18 12:09:51

标签: cluster-computing apache-spark

标题“地点级别”和5状态数据的含义是什么 本地 - >过程本地 - > node local - > rack local - >任何?

enter image description here

2 个答案:

答案 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中进行了讨论。
然后,让我们将这些级别放到一个表中,

enter image description here

请注意,可以根据spark configuration中的指南跳过特定级别。

例如,如果要跳过NODE_LOCAL,只需将spark.locality.wait.node设置为0。