Que signifient les nombres sur la barre de progression dans Spark-Shell?


92

Dans mon spark-shell, que signifient les entrées comme celles ci-dessous lorsque j'exécute une fonction?

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

4
J'ai changé l'exemple pour utiliser des nombres plus intéressants et changer le titre pour rendre la question plus facile à trouver. Cela enlève un peu à votre question initiale, car cela montre clairement qu'il s'agit d'une barre de progression (ce qui dans votre cas n'était pas du tout clair, car elle était à 0). Mais je pense que c'est globalement plus utile de cette façon. Si vous n'êtes pas d'accord, n'hésitez pas à annuler mes modifications! Merci!
Daniel Darabos

Cela

2
Question cool. Je me demande pourquoi je ne l'ai pas demandé pendant un an (durée de mon travail sur Spark) !!
Prashant

Réponses:


102

Ce que vous obtenez est un Console Progress Bar, [Stage 7:montre la scène dans laquelle vous êtes maintenant, et (14174 + 5) / 62500]est (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]. La barre de progression affiche numCompletedTasks/ totalNumOfTasksInThisStage.

Il sera affiché lorsque les deux spark.ui.showConsoleProgress sont true (par défaut) et que le niveau de journalisation conf/log4j.propertiesest ERRORou WARN( !log.isInfoEnabledest vrai).

Voyons le code dans ConsoleProgressBar.scala qui le montre:

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
Très bonne réponse! Voici un lien vers la pull request qui a introduit cette fonctionnalité: github.com/apache/spark/pull/3029 . Cette page contient des discussions intéressantes sur la conception RE: le comportement de cette barre de progression, en particulier pour les travaux en plusieurs étapes.
Josh Rosen

30

Supposons que vous voyez ce qui suit (X, A, B, C sont toujours des entiers non négatifs):

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

(par exemple dans la question X = 7, A = 14174, B = 5 et C = 62500)

Voici ce qui se passe à un niveau élevé: Spark divise le travail en étapes et les tâches à chaque étape. Cet indicateur de progression signifie que l'étape X comprend des tâches C. Pendant l'exécution, A et B commencent à zéro et continuent de changer. A est toujours le nombre de tâches déjà terminées et B est le nombre de tâches en cours d'exécution. Pour une étape avec de nombreuses tâches (bien plus que les travailleurs que vous avez), vous devriez vous attendre à voir B passer à un nombre qui correspond au nombre de travailleurs que vous avez dans le cluster, alors vous devriez commencer à voir A augmenter à mesure que les tâches sont terminées. Vers la fin, au fur et à mesure que les dernières tâches s'exécutent, B commencera à diminuer jusqu'à ce qu'il atteigne 0, point auquel A devrait égaler C, l'étape est terminée et l'étincelle passe à l'étape suivante. C restera constant pendant tout le temps, rappelez-vous qu'il s'agit du nombre total de tâches dans l'étape et qu'il ne change jamais.

Le ====> montre le pourcentage de travail effectué en fonction de ce que j'ai décrit ci-dessus. Au début, le> sera vers la gauche et se déplacera vers la droite à mesure que les tâches sont terminées.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.