Skip to content

Commit 8d01bd8

Browse files
Merge pull request apache#26 from sven0726/2.2-xspark
spark ui 重写
2 parents 319a039 + 00cff81 commit 8d01bd8

File tree

4 files changed

+65
-12
lines changed

4 files changed

+65
-12
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.apache.spark.deploy
2+
3+
import org.apache.commons.lang3.StringUtils
4+
import org.apache.spark.internal.Logging
5+
6+
/**
7+
* Created by Qiniu on 31/7/2017.
8+
*/
9+
object XSparkUI extends Logging{
10+
11+
private final val ENV_XSPARK_AGENT = "XSPARK_AGENT"
12+
13+
final val WORKER_DOMAIN = "worker_domain"
14+
final val DRIVER_DOMAIN = "driver_domain"
15+
final val CLUSTER_DOMAIN = "spark_cluster_domain"
16+
final val POUND = "#"
17+
18+
def retrieveXSparkAP(domainType: String): String = synchronized {
19+
sys.env.foreach { env =>
20+
logDebug(env._1 + ":" + env._2)
21+
}
22+
try {
23+
val xsparkAgentHost = sys.env.get(ENV_XSPARK_AGENT).getOrElse(POUND)
24+
val domain_api = s"http://${xsparkAgentHost}/api/domain_mapping"
25+
logDebug(s"Query domain mapping from ${domain_api} ...")
26+
val result = scala.io.Source.fromURL(domain_api).mkString
27+
val domain_mapping = scala.util.parsing.json.JSON.parseFull(result)
28+
val apDomain = domain_mapping match {
29+
case Some(m: Map[String, Any]) => m(domainType) match {
30+
case domain: String =>
31+
logInfo(s"Get domain ${domainType} is ${domain}")
32+
if(domainType == WORKER_DOMAIN) {
33+
return domain.replace("http://", "")
34+
}
35+
return domain
36+
case None => POUND
37+
}
38+
}
39+
apDomain.toString()
40+
}
41+
catch {
42+
case e: Exception =>
43+
logError("Failed to retrieve xspark ap domain", e)
44+
// We would rather return POUND(#) than throw exceptions to ui
45+
POUND
46+
}
47+
}
48+
49+
}

core/src/main/scala/org/apache/spark/deploy/master/ui/ApplicationPage.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import javax.servlet.http.HttpServletRequest
2222
import scala.xml.Node
2323

2424
import org.apache.spark.deploy.DeployMessages.{MasterStateResponse, RequestMasterState}
25-
import org.apache.spark.deploy.ExecutorState
25+
import org.apache.spark.deploy.{ExecutorState, XSparkUI}
2626
import org.apache.spark.deploy.master.ExecutorDesc
2727
import org.apache.spark.ui.{ToolTips, UIUtils, WebUIPage}
2828
import org.apache.spark.util.Utils
@@ -35,6 +35,7 @@ private[ui] class ApplicationPage(parent: MasterWebUI) extends WebUIPage("app")
3535
def render(request: HttpServletRequest): Seq[Node] = {
3636
// stripXSS is called first to remove suspicious characters used in XSS attacks
3737
val appId = UIUtils.stripXSS(request.getParameter("appId"))
38+
val driverDomain = XSparkUI.retrieveXSparkAP(XSparkUI.DRIVER_DOMAIN)
3839
val state = master.askSync[MasterStateResponse](RequestMasterState)
3940
val app = state.activeApps.find(_.id == appId)
4041
.getOrElse(state.completedApps.find(_.id == appId).orNull)
@@ -89,8 +90,7 @@ private[ui] class ApplicationPage(parent: MasterWebUI) extends WebUIPage("app")
8990
{
9091
if (!app.isFinished) {
9192
<li><strong>
92-
<a href={UIUtils.makeHref(parent.master.reverseProxy,
93-
app.id, app.desc.appUiUrl)}>Application Detail UI</a>
93+
<a href={driverDomain}>Application Detail UI</a>
9494
</strong></li>
9595
}
9696
}
@@ -114,21 +114,23 @@ private[ui] class ApplicationPage(parent: MasterWebUI) extends WebUIPage("app")
114114
}
115115

116116
private def executorRow(executor: ExecutorDesc): Seq[Node] = {
117+
val workerDomain = XSparkUI.retrieveXSparkAP(XSparkUI.WORKER_DOMAIN)
118+
val workerUrl = "%s%s.%s".format("http://", executor.worker.host, workerDomain)
117119
val workerUrlRef = UIUtils.makeHref(parent.master.reverseProxy,
118120
executor.worker.id, executor.worker.webUiAddress)
119121
<tr>
120122
<td>{executor.id}</td>
121123
<td>
122-
<a href={workerUrlRef}>{executor.worker.id}</a>
124+
<a href={workerUrl}>{executor.worker.id}</a>
123125
</td>
124126
<td>{executor.cores}</td>
125127
<td>{executor.memory}</td>
126128
<td>{executor.state}</td>
127129
<td>
128130
<a href={"%s/logPage?appId=%s&executorId=%s&logType=stdout"
129-
.format(workerUrlRef, executor.application.id, executor.id)}>stdout</a>
131+
.format(workerUrl, executor.application.id, executor.id)}>stdout</a>
130132
<a href={"%s/logPage?appId=%s&executorId=%s&logType=stderr"
131-
.format(workerUrlRef, executor.application.id, executor.id)}>stderr</a>
133+
.format(workerUrl, executor.application.id, executor.id)}>stderr</a>
132134
</td>
133135
</tr>
134136
}

core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import scala.xml.Node
2424
import org.json4s.JValue
2525

2626
import org.apache.spark.deploy.DeployMessages.{KillDriverResponse, MasterStateResponse, RequestKillDriver, RequestMasterState}
27-
import org.apache.spark.deploy.JsonProtocol
27+
import org.apache.spark.deploy.{JsonProtocol, XSparkUI}
2828
import org.apache.spark.deploy.master._
2929
import org.apache.spark.ui.{UIUtils, WebUIPage}
3030
import org.apache.spark.util.Utils
@@ -176,11 +176,13 @@ private[ui] class MasterPage(parent: MasterWebUI) extends WebUIPage("") {
176176
}
177177

178178
private def workerRow(worker: WorkerInfo): Seq[Node] = {
179+
val workerDomain = XSparkUI.retrieveXSparkAP(XSparkUI.WORKER_DOMAIN)
180+
val workerNewDomain = "http://%s.%s".format(worker.host, workerDomain)
179181
<tr>
180182
<td>
181183
{
182184
if (worker.isAlive()) {
183-
<a href={UIUtils.makeHref(parent.master.reverseProxy, worker.id, worker.webUiAddress)}>
185+
<a href={workerNewDomain}>
184186
{worker.id}
185187
</a>
186188
} else {
@@ -220,8 +222,7 @@ private[ui] class MasterPage(parent: MasterWebUI) extends WebUIPage("") {
220222
if (app.isFinished) {
221223
app.desc.name
222224
} else {
223-
<a href={UIUtils.makeHref(parent.master.reverseProxy,
224-
app.id, app.desc.appUiUrl)}>{app.desc.name}</a>
225+
<a href={"app?appId=" + app.id}>{app.desc.name}</a>
225226
}
226227
}
227228
</td>

core/src/main/scala/org/apache/spark/deploy/worker/ui/WorkerPage.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import scala.xml.Node
2424
import org.json4s.JValue
2525

2626
import org.apache.spark.deploy.DeployMessages.{RequestWorkerState, WorkerStateResponse}
27-
import org.apache.spark.deploy.JsonProtocol
27+
import org.apache.spark.deploy.{JsonProtocol, XSparkUI}
2828
import org.apache.spark.deploy.master.DriverState
2929
import org.apache.spark.deploy.worker.{DriverRunner, ExecutorRunner}
3030
import org.apache.spark.ui.{UIUtils, WebUIPage}
@@ -40,6 +40,7 @@ private[ui] class WorkerPage(parent: WorkerWebUI) extends WebUIPage("") {
4040

4141
def render(request: HttpServletRequest): Seq[Node] = {
4242
val workerState = workerEndpoint.askSync[WorkerStateResponse](RequestWorkerState)
43+
val masterDomain = XSparkUI.retrieveXSparkAP(XSparkUI.CLUSTER_DOMAIN)
4344

4445
val executorHeaders = Seq("ExecutorID", "Cores", "State", "Memory", "Job Details", "Logs")
4546
val runningExecutors = workerState.executors
@@ -70,7 +71,7 @@ private[ui] class WorkerPage(parent: WorkerWebUI) extends WebUIPage("") {
7071
<li><strong>Memory:</strong> {Utils.megabytesToString(workerState.memory)}
7172
({Utils.megabytesToString(workerState.memoryUsed)} Used)</li>
7273
</ul>
73-
<p><a href={workerState.masterWebUiUrl}>Back to Master</a></p>
74+
<p><a href={masterDomain}>Back to Master</a></p>
7475
</div>
7576
</div>
7677
<div class="row-fluid"> <!-- Executors and Drivers -->

0 commit comments

Comments
 (0)