aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/resources/org
diff options
context:
space:
mode:
authorAndrew Or <andrew@databricks.com>2015-05-18 10:59:35 -0700
committerAndrew Or <andrew@databricks.com>2015-05-18 10:59:35 -0700
commit563bfcc1ab1b1c79b1845230c8c600db85a08fe3 (patch)
treeb5edd897a8034afb0666c4913e26637b472e255a /core/src/main/resources/org
parent814b3dabdf01abc7a2f25aa32284caccadeb7798 (diff)
downloadspark-563bfcc1ab1b1c79b1845230c8c600db85a08fe3.tar.gz
spark-563bfcc1ab1b1c79b1845230c8c600db85a08fe3.tar.bz2
spark-563bfcc1ab1b1c79b1845230c8c600db85a08fe3.zip
[SPARK-7627] [SPARK-7472] DAG visualization: style skipped stages
This patch fixes two things: **SPARK-7627.** Cached RDDs no longer light up on the job page. This is a simple fix. **SPARK-7472.** Display skipped stages differently from normal stages. The latter is a major UX issue. Because we link the job viz to the stage viz even for skipped stages, the user may inadvertently click into the stage page of a skipped stage, which is empty. ------------------- <img src="https://cloud.githubusercontent.com/assets/2133137/7675241/de1a3da6-fcea-11e4-8101-88055cef78c5.png" width="300px" /> Author: Andrew Or <andrew@databricks.com> Closes #6171 from andrewor14/dag-viz-skipped and squashes the following commits: f261797 [Andrew Or] Merge branch 'master' of github.com:apache/spark into dag-viz-skipped 0eda358 [Andrew Or] Tweak skipped stage border color c604150 [Andrew Or] Tweak grayscale colors 7010676 [Andrew Or] Merge branch 'master' of github.com:apache/spark into dag-viz-skipped 762b541 [Andrew Or] Use special prefix for stage clusters to avoid collisions 51c95b9 [Andrew Or] Merge branch 'master' of github.com:apache/spark into dag-viz-skipped b928cd4 [Andrew Or] Fix potential leak + write tests for it 7c4c364 [Andrew Or] Show skipped stages differently 7cc34ce [Andrew Or] Merge branch 'master' of github.com:apache/spark into dag-viz-skipped c121fa2 [Andrew Or] Fix cache color
Diffstat (limited to 'core/src/main/resources/org')
-rw-r--r--core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.css71
-rw-r--r--core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.js50
2 files changed, 76 insertions, 45 deletions
diff --git a/core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.css b/core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.css
index eedefb44b9..3b4ae2ed35 100644
--- a/core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.css
+++ b/core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.css
@@ -15,32 +15,21 @@
* limitations under the License.
*/
-#dag-viz-graph svg path {
- stroke: #444;
- stroke-width: 1.5px;
-}
-
-#dag-viz-graph svg g.cluster rect {
- stroke-width: 1px;
-}
-
-#dag-viz-graph svg g.node circle {
- fill: #444;
+#dag-viz-graph a, #dag-viz-graph a:hover {
+ text-decoration: none;
}
-#dag-viz-graph svg g.node rect {
- fill: #C3EBFF;
- stroke: #3EC0FF;
- stroke-width: 1px;
+#dag-viz-graph .label {
+ font-weight: normal;
+ text-shadow: none;
}
-#dag-viz-graph svg g.node.cached circle {
- fill: #444;
+#dag-viz-graph svg path {
+ stroke: #444;
+ stroke-width: 1.5px;
}
-#dag-viz-graph svg g.node.cached rect {
- fill: #B3F5C5;
- stroke: #56F578;
+#dag-viz-graph svg g.cluster rect {
stroke-width: 1px;
}
@@ -61,12 +50,23 @@
stroke-width: 1px;
}
-#dag-viz-graph svg.job g.cluster[class*="stage"] rect {
+#dag-viz-graph svg.job g.cluster.skipped rect {
+ fill: #D6D6D6;
+ stroke: #B7B7B7;
+ stroke-width: 1px;
+}
+
+#dag-viz-graph svg.job g.cluster.stage rect {
fill: #FFFFFF;
stroke: #FF99AC;
stroke-width: 1px;
}
+#dag-viz-graph svg.job g.cluster.stage.skipped rect {
+ stroke: #ADADAD;
+ stroke-width: 1px;
+}
+
#dag-viz-graph svg.job g#cross-stage-edges path {
fill: none;
}
@@ -75,6 +75,20 @@
fill: #333;
}
+#dag-viz-graph svg.job g.cluster.skipped text {
+ fill: #666;
+}
+
+#dag-viz-graph svg.job g.node circle {
+ fill: #444;
+}
+
+#dag-viz-graph svg.job g.node.cached circle {
+ fill: #A3F545;
+ stroke: #52C366;
+ stroke-width: 2px;
+}
+
/* Stage page specific styles */
#dag-viz-graph svg.stage g.cluster rect {
@@ -83,7 +97,7 @@
stroke-width: 1px;
}
-#dag-viz-graph svg.stage g.cluster[class*="stage"] rect {
+#dag-viz-graph svg.stage g.cluster.stage rect {
fill: #FFFFFF;
stroke: #FFA6B6;
stroke-width: 1px;
@@ -97,11 +111,14 @@
fill: #333;
}
-#dag-viz-graph a, #dag-viz-graph a:hover {
- text-decoration: none;
+#dag-viz-graph svg.stage g.node rect {
+ fill: #C3EBFF;
+ stroke: #3EC0FF;
+ stroke-width: 1px;
}
-#dag-viz-graph .label {
- font-weight: normal;
- text-shadow: none;
+#dag-viz-graph svg.stage g.node.cached rect {
+ fill: #B3F5C5;
+ stroke: #52C366;
+ stroke-width: 2px;
}
diff --git a/core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.js b/core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.js
index ee48fd29a6..aaeba5b102 100644
--- a/core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.js
+++ b/core/src/main/resources/org/apache/spark/ui/static/spark-dag-viz.js
@@ -57,9 +57,7 @@ var VizConstants = {
stageSep: 40,
graphPrefix: "graph_",
nodePrefix: "node_",
- stagePrefix: "stage_",
- clusterPrefix: "cluster_",
- stageClusterPrefix: "cluster_stage_"
+ clusterPrefix: "cluster_"
};
var JobPageVizConstants = {
@@ -133,9 +131,7 @@ function renderDagViz(forJob) {
}
// Render
- var svg = graphContainer()
- .append("svg")
- .attr("class", jobOrStage);
+ var svg = graphContainer().append("svg").attr("class", jobOrStage);
if (forJob) {
renderDagVizForJob(svg);
} else {
@@ -185,23 +181,32 @@ function renderDagVizForJob(svgContainer) {
var dot = metadata.select(".dot-file").text();
var stageId = metadata.attr("stage-id");
var containerId = VizConstants.graphPrefix + stageId;
- // Link each graph to the corresponding stage page (TODO: handle stage attempts)
- var stageLink = $("#stage-" + stageId.replace(VizConstants.stagePrefix, "") + "-0")
- .find("a")
- .attr("href") + "&expandDagViz=true";
- var container = svgContainer
- .append("a")
- .attr("xlink:href", stageLink)
- .append("g")
- .attr("id", containerId);
+ var isSkipped = metadata.attr("skipped") == "true";
+ var container;
+ if (isSkipped) {
+ container = svgContainer
+ .append("g")
+ .attr("id", containerId)
+ .attr("skipped", "true");
+ } else {
+ // Link each graph to the corresponding stage page (TODO: handle stage attempts)
+ // Use the link from the stage table so it also works for the history server
+ var attemptId = 0
+ var stageLink = d3.select("#stage-" + stageId + "-" + attemptId)
+ .select("a")
+ .attr("href") + "&expandDagViz=true";
+ container = svgContainer
+ .append("a")
+ .attr("xlink:href", stageLink)
+ .append("g")
+ .attr("id", containerId);
+ }
// Now we need to shift the container for this stage so it doesn't overlap with
// existing ones, taking into account the position and width of the last stage's
// container. We do not need to do this for the first stage of this job.
if (i > 0) {
- var existingStages = svgContainer
- .selectAll("g.cluster")
- .filter("[class*=\"" + VizConstants.stageClusterPrefix + "\"]");
+ var existingStages = svgContainer.selectAll("g.cluster.stage")
if (!existingStages.empty()) {
var lastStage = d3.select(existingStages[0].pop());
var lastStageWidth = toFloat(lastStage.select("rect").attr("width"));
@@ -214,6 +219,12 @@ function renderDagVizForJob(svgContainer) {
// Actually render the stage
renderDot(dot, container, true);
+ // Mark elements as skipped if appropriate. Unfortunately we need to mark all
+ // elements instead of the parent container because of CSS override rules.
+ if (isSkipped) {
+ container.selectAll("g").classed("skipped", true);
+ }
+
// Round corners on rectangles
container
.selectAll("rect")
@@ -243,6 +254,9 @@ function renderDot(dot, container, forJob) {
var renderer = new dagreD3.render();
preprocessGraphLayout(g, forJob);
renderer(container, g);
+
+ // Find the stage cluster and mark it for styling and post-processing
+ container.selectAll("g.cluster[name*=\"Stage\"]").classed("stage", true);
}
/* -------------------- *