O que significam os números na barra de progresso no shell do spark?

92

Em meu shell de faísca, o que entradas como as abaixo significam quando eu executo uma função?

[Stage7:===========>                              (14174 + 5) / 62500]
rmckeown
fonte
4
Mudei o exemplo para usar números mais interessantes e mudei o título para tornar a pergunta mais fácil de encontrar. Isso tira um pouco da sua pergunta original, porque deixa claro que se trata de uma barra de progresso (que no seu caso não estava nada clara, pois estava em 0). Mas acho que é mais útil assim no geral. Se você discordar, sinta-se à vontade para desfazer minhas alterações! Obrigado!
Daniel Darabos
Parece-me bem - obrigado por isso
rmckeown
2
Pergunta legal. Querendo saber por que eu não pedi por um ano (duração do meu trabalho no Spark) !!
Prashant

Respostas:

102

O que você obtém é um Console Progress Bar, [Stage 7:mostra o estágio em que você está agora, e (14174 + 5) / 62500]é (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]. A barra de progresso mostra numCompletedTasks/ totalNumOfTasksInThisStage.

Será mostrado quando ambos spark.ui.showConsoleProgress forem verdadeiros (por padrão) e o nível de registro conf/log4j.propertiesfor ERRORou WARN( !log.isInfoEnabledverdadeiros).

Vamos ver o código em ConsoleProgressBar.scala que o 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
}
yjshen
fonte
8
Ótima resposta! Aqui está um link para a solicitação pull que introduziu esse recurso: github.com/apache/spark/pull/3029 . Essa página tem algumas discussões de design interessantes RE: o comportamento dessa barra de progresso, especialmente para trabalhos de vários estágios.
Josh Rosen
30

Vamos supor que você veja o seguinte (X, A, B, C são sempre inteiros não negativos):

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

(por exemplo, na pergunta X = 7, A = 14174, B = 5 e C = 62500)

Aqui está o que está acontecendo em alto nível: o Spark divide o trabalho em estágios e tarefas em cada estágio. Este indicador de progresso significa que o Estágio X é composto de tarefas C. Durante a execução, A e B começam em zero e continuam mudando. A é sempre o número de tarefas já concluídas e B é o número de tarefas em execução no momento. Para um estágio com muitas tarefas (muito mais do que os trabalhadores que você tem), você deve esperar ver B crescer a um número que corresponde a quantos trabalhadores você tem no cluster, então você deve começar a ver A aumentar conforme as tarefas são concluídas. No final, conforme as últimas tarefas são executadas, B começará a diminuir até atingir 0, quando o ponto A deve ser igual a C, o estágio está concluído e a centelha passa para o próximo estágio. C permanecerá constante durante todo o tempo, lembre-se que é o número total de tarefas no estágio e nunca muda.

O ====> mostra a porcentagem de trabalho realizado com base no que descrevi acima. No início, o> estará para a esquerda e se moverá para a direita conforme as tarefas são concluídas.

gae123
fonte