web-dev-qa-db-fra.com

Quelle est la signification de "Locality Level" sur Spark cluster

Quelle est la signification du titre "Locality Level" et des 5 statuts Data local -> process local -> node local -> rack local -> Any?

enter image description here

41
fanhk

Pour autant que je sache, le niveau de localité indique quel type d'accès aux données a été effectué. Lorsqu'un nœud termine tout son travail et que son processeur devient inactif, Spark peut décider de démarrer d'autres tâches en attente qui nécessitent d'obtenir des données à d'autres endroits. Donc, idéalement, toutes vos tâches doivent être traitées localement car elles est associé à une latence d'accès aux données plus faible.

Vous pouvez configurer le temps d'attente avant de passer à d'autres niveaux de localité à l'aide de:

spark.locality.wait

Plus d'informations sur les paramètres peuvent être trouvées dans les Spark Configuration docs

En ce qui concerne les différents niveaux PROCESS_LOCAL, NODE_LOCAL, RACK_LOCAL ou ANY, je pense que les méthodes findTask et findSpeculativeTask dans org.Apache.spark.scheduler.TaskSetManager illustre comment Spark choisit les tâches en fonction sur leur niveau de localité. Il vérifiera d'abord les tâches PROCESS_LOCAL qui vont être lancées dans le même processus d'exécuteur. Sinon, il vérifiera les tâches NODE_LOCAL qui peuvent se trouver dans d'autres exécuteurs du même nœud ou il doit être récupéré à partir de des systèmes tels que HDFS, mis en cache, etc. RACK_LOCAL signifie que les données se trouvent dans un autre nœud et qu'elles doivent donc être transférées avant l'exécution. Enfin, TOUT est de prendre n'importe quelle tâche en attente qui peut s'exécuter dans le nœud actuel.

  /**
   * 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)
  }
45
Daniel H.