Co oznaczają liczby na pasku postępu w powłoce iskry?

93

Co w mojej powłoce iskrowej oznaczają wpisy takie jak poniżej, gdy wykonuję funkcję?

[Stage7:===========>                              (14174 + 5) / 62500]
rmckeown
źródło
4
Zmieniłem przykład, aby użyć bardziej interesujących liczb i zmieniłem tytuł, aby ułatwić znalezienie pytania. To trochę odbiega od pierwotnego pytania, ponieważ wyjaśnia, że ​​jest to pasek postępu (który w twoim przypadku wcale nie był jasny, ponieważ znajdował się na 0). Ale myślę, że ogólnie jest to bardziej przydatne. Jeśli się nie zgadzasz, możesz cofnąć moje zmiany! Dzięki!
Daniel Darabos
Brzmi dobrze - dzięki za to
rmckeown
2
Fajne pytanie. Zastanawiam się, dlaczego nie prosiłem o to przez rok (czas pracy nad Spark) !!
Prashant

Odpowiedzi:

103

To, co otrzymujesz, jest Console Progress Bar, [Stage 7:pokazuje etap, na którym się teraz znajdujesz, i (14174 + 5) / 62500]jest (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]. Pasek postępu pokazuje numCompletedTasks/ totalNumOfTasksInThisStage.

Zostanie wyświetlony, gdy oba spark.ui.showConsoleProgress mają wartość prawda (domyślnie) i poziom logowania conf/log4j.propertiesto ERRORlub WARN( !log.isInfoEnabledjest prawdziwe).

Zobaczmy kod w ConsoleProgressBar.scala, który to pokazuje:

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
źródło
8
Świetna odpowiedź! Oto link do żądania ściągnięcia, które wprowadziło tę funkcję: github.com/apache/spark/pull/3029 . Ta strona zawiera interesujące dyskusje na temat projektowania RE: zachowanie tego paska postępu, szczególnie w przypadku zadań wieloetapowych.
Josh Rosen
31

Załóżmy, że widzisz co następuje (X, A, B, C są zawsze nieujemnymi liczbami całkowitymi):

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

(na przykład w pytaniu X = 7, A = 14174, B = 5 i C = 62500)

Oto, co dzieje się na wysokim poziomie: Spark dzieli pracę na etapy i zadania na każdym etapie. Ten wskaźnik postępu oznacza, że ​​Etap X składa się z zadań C. Podczas wykonywania A i B zaczynają się od zera i ciągle się zmieniają. A to zawsze liczba zadań już zakończonych, a B to liczba zadań aktualnie wykonywanych. W przypadku etapu z wieloma zadaniami (znacznie większy niż liczba pracowników, których masz), powinieneś spodziewać się, że liczba B wzrośnie do liczby odpowiadającej liczbie pracowników w klastrze, a następnie powinieneś zacząć widzieć wzrost A w miarę wykonywania zadań. Pod koniec, w miarę wykonywania ostatnich kilku zadań, B zacznie zmniejszać się, aż osiągnie 0, w którym to punkcie A powinno równać się C, etap jest zakończony, a iskra przechodzi do następnego etapu. C pozostanie niezmienne przez cały czas, pamiętaj, że jest to całkowita liczba zadań na etapie i nigdy się nie zmienia.

====> pokazuje procent pracy wykonanej na podstawie tego, co opisałem powyżej. Na początku znak> będzie skierowany w lewo i będzie przesuwał się w prawo w miarę wykonywania zadań.

gae123
źródło