Cosa significano i numeri sulla barra di avanzamento in Spark-Shell?


92

Nella mia shell spark, cosa significano voci come quelle sotto quando eseguo una funzione?

[Stage7:===========>                              (14174 + 5) / 62500]

4
Ho cambiato l'esempio per utilizzare numeri più interessanti e ho cambiato il titolo per rendere la domanda più facile da trovare. Questo toglie un po 'alla tua domanda originale, perché questo rende chiaro che si tratta di una barra di avanzamento (che nel tuo caso non era affatto chiara, poiché era ferma a 0). Ma penso che sia più utile in questo modo nel complesso. Se non sei d'accordo, sentiti libero di annullare le mie modifiche! Grazie!
Daniel Darabos

Suona bene per me - grazie per questo
rmckeown

2
Bella domanda. Mi chiedo perché non l'ho chiesto per un anno (durata del mio lavoro su Spark) !!
Prashant

Risposte:


102

Quello che ottieni è un Console Progress Bar, [Stage 7:mostra lo stadio in cui ti trovi ora, ed (14174 + 5) / 62500]è (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]. La barra di avanzamento mostra numCompletedTasks/ totalNumOfTasksInThisStage.

Verrà mostrato quando entrambi spark.ui.showConsoleProgress sono veri (per impostazione predefinita) e il livello di accesso conf/log4j.propertiesè ERRORo WARN( !log.isInfoEnabledè vero).

Vediamo il codice in ConsoleProgressBar.scala che lo mostra:

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
}

8
Bella risposta! Di seguito è riportato un collegamento alla richiesta pull che ha introdotto questa funzionalità: github.com/apache/spark/pull/3029 . Quella pagina contiene alcune interessanti discussioni sul design RE: il comportamento di questa barra di avanzamento, specialmente per lavori in più fasi.
Josh Rosen

30

Supponiamo di vedere quanto segue (X, A, B, C sono sempre numeri interi non negativi):

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

(ad esempio nella domanda X = 7, A = 14174, B = 5 e C = 62500)

Ecco cosa sta succedendo ad alto livello: Spark interrompe il lavoro in fasi e le attività in ciascuna fase. Questo indicatore di avanzamento indica che la fase X comprende attività C. Durante l'esecuzione, A e B iniziano da zero e continuano a cambiare. A è sempre il numero di attività già terminate e B è il numero di attività attualmente in esecuzione. Per una fase con molte attività (molto più dei lavoratori che hai) dovresti aspettarti di vedere B crescere fino a un numero che corrisponde a quanti lavoratori hai nel cluster, quindi dovresti iniziare a vedere A aumentare man mano che le attività vengono completate. Verso la fine, mentre vengono eseguite le ultime poche attività, B inizierà a diminuire fino a raggiungere 0, a quel punto A dovrebbe essere uguale a C, lo stadio è finito e la scintilla si sposta allo stadio successivo. C rimarrà costante per tutto il tempo, ricorda che è il numero totale di attività nello stage e non cambia mai.

====> mostra la percentuale di lavoro svolto in base a quanto descritto sopra. All'inizio il> sarà verso sinistra e si sposterà a destra quando le attività saranno completate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.