martin-g commented on a change in pull request #34622:
URL: https://github.com/apache/spark/pull/34622#discussion_r819314166



##########
File path: 
sql/core/src/main/scala/org/apache/spark/sql/execution/ui/SQLAppStatusListener.scala
##########
@@ -138,6 +139,30 @@ class SQLAppStatusListener(
     }
   }
 
+  override def onStageCompleted(stageCompleted: SparkListenerStageCompleted): 
Unit = {
+    if (!isSQLStage(stageCompleted.stageInfo.stageId)) {
+      return
+    }
+    val stageNum = stageCompleted.stageInfo.stageId
+    val attemptID = stageCompleted.stageInfo.attemptNumber()
+
+    // gets the executionID that finished the stage
+    val liveExecution = liveExecutions.values().asScala
+    val execID = 
liveExecution.filter(_.stages.contains(stageNum)).head.executionId

Review comment:
       is this filter always returning non-empty collection ?

##########
File path: 
sql/core/src/main/scala/org/apache/spark/sql/execution/ui/SQLAppStatusStore.scala
##########
@@ -79,8 +79,26 @@ class SQLAppStatusStore(
   def planGraph(executionId: Long): SparkPlanGraph = {
     store.read(classOf[SparkPlanGraphWrapper], executionId).toSparkPlanGraph()
   }
+
+  def getStageAttempt(executionId: Long): List[(Int, Int)] = {

Review comment:
       ```suggestion
     def getStageAttempts(executionId: Long): List[(Int, Int)] = {
   ```

##########
File path: 
sql/core/src/main/scala/org/apache/spark/sql/execution/ui/SparkPlanGraph.scala
##########
@@ -179,6 +185,9 @@ class SparkPlanGraphNode(
       // Note: whitespace between two "\n"s is to create an empty line between 
the name of
       // SparkPlan and metrics. If removing it, it won't display the empty 
line in UI.
       builder ++= "<br><br>"
+      if (!stagesGraph.getOrElse(id, List()).isEmpty) {

Review comment:
       ```suggestion
         if (!stagesGraph.getOrElse(id, Nil).isEmpty) {
   ```

##########
File path: 
sql/core/src/main/scala/org/apache/spark/sql/execution/ui/SparkPlanGraph.scala
##########
@@ -179,6 +185,9 @@ class SparkPlanGraphNode(
       // Note: whitespace between two "\n"s is to create an empty line between 
the name of
       // SparkPlan and metrics. If removing it, it won't display the empty 
line in UI.
       builder ++= "<br><br>"
+      if (!stagesGraph.getOrElse(id, List()).isEmpty) {
+        builder ++= "Stages: " + stagesGraph.getOrElse(id, 
List()).mkString(",") + "\n"

Review comment:
       ```suggestion
           builder ++= "Stages: " + stagesGraph.getOrElse(id, 
Nil).mkString(",") + "\n"
   ```

##########
File path: 
sql/core/src/main/scala/org/apache/spark/sql/execution/ui/ExecutionPage.scala
##########
@@ -128,6 +136,10 @@ class ExecutionPage(parent: SQLTab) extends 
WebUIPage("execution") with Logging
   private def jobURL(request: HttpServletRequest, jobId: Long): String =
     "%s/jobs/job/?id=%s".format(UIUtils.prependBaseUri(request, 
parent.basePath), jobId)
 
+  private def stageURL(request: HttpServletRequest, stageId: Int, attemptId: 
Int): String =
+    "%s/stages/stage/?id=%s&attempt=%s".format(

Review comment:
       nit: since you use `String.format()` you can use `%d` for the Int 
parameters, but it doesn't really matter

##########
File path: 
sql/core/src/test/scala/org/apache/spark/sql/execution/ui/SQLAppStatusListenerSuite.scala
##########
@@ -550,6 +550,10 @@ class SQLAppStatusListenerSuite extends SharedSparkSession 
with JsonTestUtils
 
     assertJobs(statusStore.execution(0), completed = 0 to 1)
     assert(statusStore.execution(0).get.stages === (0 to 3).toSet)
+
+    // Check stage and attemptID are gathered correctly.
+    val stageAttempt = statusStore.getStageAttempt(executionId)

Review comment:
       ```suggestion
       val stageAttempts = statusStore.getStageAttempt(executionId)
   ```

##########
File path: 
sql/core/src/main/scala/org/apache/spark/sql/execution/ui/SparkPlanGraph.scala
##########
@@ -53,6 +53,12 @@ case class SparkPlanGraph(
       case node => Seq(node)
     }
   }
+
+  def getAllIds: Seq[Long] = {
+    allNodes.map {

Review comment:
       ```suggestion
       allNodes.map(_.id)
   ```




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to