Was bedeuten die Zahlen auf dem Fortschrittsbalken in der Funkenschale?

92

Was bedeuten Einträge wie die folgenden in meiner Spark-Shell, wenn ich eine Funktion ausführe?

[Stage7:===========>                              (14174 + 5) / 62500]
rmckeown
quelle
4
Ich habe das Beispiel geändert, um interessantere Zahlen zu verwenden, und den Titel geändert, damit die Frage leichter zu finden ist. Dies nimmt ein wenig von Ihrer ursprünglichen Frage ab, da dies deutlich macht, dass dies ein Fortschrittsbalken ist (der in Ihrem Fall überhaupt nicht klar war, da er bei 0 stand). Aber ich denke, es ist insgesamt insgesamt nützlicher. Wenn Sie nicht einverstanden sind, können Sie meine Änderungen rückgängig machen! Vielen Dank!
Daniel Darabos
Klingt gut für mich - danke dafür
rmckeown
2
Coole Frage. Ich frage mich, warum ich es ein Jahr lang nicht gefragt habe (Dauer meiner Arbeit an Spark) !!
Prashant

Antworten:

102

Was Sie bekommen, ist a Console Progress Bar, [Stage 7:zeigt die Bühne, in der Sie sich gerade befinden, und (14174 + 5) / 62500]ist (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]. Der Fortschrittsbalken zeigt numCompletedTasks/ totalNumOfTasksInThisStage.

Es wird angezeigt, wenn beide spark.ui.showConsoleProgress wahr ist (Standardeinstellung) und -Protokollstufe in conf/log4j.propertiesist ERRORoder WARN( !log.isInfoEnabledwahr ist ).

Sehen wir uns den Code in ConsoleProgressBar.scala an , der ihn zeigt:

private def show(now: Long, stages: Seq[SparkStageInfo]) {
  val width = TerminalWidth / stages.size
  val bar = stages.map { s =>
    val total = s.numTasks()
    val header = s"[Stage ${s.stageId()}:"
    val tailer = s"(${s.numCompletedTasks()} + ${s.numActiveTasks()}) / $total]"
    val w = width - header.length - tailer.length
    val bar = if (w > 0) {
      val percent = w * s.numCompletedTasks() / total
      (0 until w).map { i =>
        if (i < percent) "=" else if (i == percent) ">" else " "
      }.mkString("")
    } else {
    ""
    }
    header + bar + tailer
  }.mkString("")

  // only refresh if it's changed of after 1 minute (or the ssh connection will be closed
  // after idle some time)
  if (bar != lastProgressBar || now - lastUpdateTime > 60 * 1000L) {
    System.err.print(CR + bar)
    lastUpdateTime = now
  }
  lastProgressBar = bar
}
yjshen
quelle
8
Gute Antwort! Hier ist ein Link zu der Pull-Anfrage, mit der diese Funktion eingeführt wurde: github.com/apache/spark/pull/3029 . Diese Seite enthält einige interessante Designdiskussionen. RE: Das Verhalten dieses Fortschrittsbalkens, insbesondere für mehrstufige Jobs.
Josh Rosen
30

Nehmen wir an, Sie sehen Folgendes (X, A, B, C sind immer nicht negative ganze Zahlen):

[Stage X:==========>            (A + B) / C]

(zum Beispiel in der Frage X = 7, A = 14174, B = 5 und C = 62500)

Hier ist, was auf hohem Niveau vor sich geht: Spark unterbricht die Arbeit in Stufen und Aufgaben in jeder Stufe. Diese Fortschrittsanzeige bedeutet, dass Stufe X aus C-Aufgaben besteht. Während der Ausführung beginnen A und B bei Null und ändern sich ständig. A ist immer die Anzahl der bereits erledigten Aufgaben und B die Anzahl der aktuell ausgeführten Aufgaben. In einer Phase mit vielen Aufgaben (weit mehr als die Mitarbeiter, die Sie haben) sollten Sie erwarten, dass B auf eine Zahl anwächst, die der Anzahl der Mitarbeiter im Cluster entspricht. Dann sollte A nach Abschluss der Aufgaben zunehmen. Gegen Ende, wenn die letzten Aufgaben ausgeführt werden, nimmt B ab, bis es 0 erreicht. An diesem Punkt sollte A gleich C sein, die Stufe ist beendet und der Funke bewegt sich zur nächsten Stufe. C bleibt während der gesamten Zeit konstant. Denken Sie daran, dass dies die Gesamtzahl der Aufgaben in der Phase ist und sich nie ändert.

Das ====> zeigt den Prozentsatz der geleisteten Arbeit basierend auf dem, was ich oben beschrieben habe. Zu Beginn befindet sich das> nach links und bewegt sich nach Abschluss der Aufgaben nach rechts.

gae123
quelle