web-dev-qa-db-ja.com

Spark clusterの「局所性レベル」の意味は何ですか

「Locality Level」というタイトルと5つのステータスData local-> process local-> node local-> rack local-> Anyの意味は何ですか?

enter image description here

41
fanhk

私の知る限り、ローカリティレベルは、実行されたデータへのアクセスのタイプを示しています。ノードがすべての作業を完了し、CPUがアイドルになると、Sparkは、他の場所からデータを取得する必要がある他の保留中のタスクを開始する場合があります。より低いデータアクセス遅延に関連付けられています。

次を使用して、他のローカリティレベルに移動するまでの待機時間を構成できます。

spark.locality.wait

パラメーターの詳細については、 Spark Configuration docs をご覧ください。

PROCESS_LOCAL、NODE_LOCAL、RACK_LOCAL、またはANYのさまざまなレベルに関して、メソッドfindTaskおよびfindSpeculativeTaskorg.Apache.spark.scheduler.TaskSetManagerでSparkがタスクを選択する方法を示します最初に、同じexecutorプロセスで起動されるPROCESS_LOCALタスクをチェックします。そうでない場合は、同じノードの他のexecutorにあるか、またはそこから取得する必要があるNODE_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)
  }
45
Daniel H.