Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

Commit 410f261

Browse files
Sergiusz UrbaniakMichael Gummelt
authored andcommitted
[SPARK-13492][MESOS] Configurable Mesos framework webui URL.
Previously the Mesos framework webui URL was being derived only from the Spark UI address leaving no possibility to configure it. This commit makes it configurable. If unset it falls back to the previous behavior. Motivation: This change is necessary in order to be able to install Spark on DCOS and to be able to give it a custom service link. The configured `webui_url` is configured to point to a reverse proxy in the DCOS environment. Locally, using unit tests and on DCOS testing and stable revision. Author: Sergiusz Urbaniak <[email protected]> Closes apache#11369 from s-urbaniak/sur-webui-url. Conflicts: core/src/test/scala/org/apache/spark/scheduler/cluster/mesos/MesosSchedulerBackendSuite.scala
1 parent 0033b92 commit 410f261

File tree

7 files changed

+87
-4
lines changed

7 files changed

+87
-4
lines changed

core/src/main/scala/org/apache/spark/deploy/mesos/MesosClusterDispatcher.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ private[mesos] class MesosClusterDispatcher(
7373

7474
def start(): Unit = {
7575
webUi.bind()
76-
scheduler.frameworkUrl = webUi.activeWebUiUrl
76+
scheduler.frameworkUrl = conf.get("spark.mesos.dispatcher.webui.url", webUi.activeWebUiUrl)
7777
scheduler.start()
7878
server.start()
7979
}

core/src/main/scala/org/apache/spark/deploy/mesos/MesosClusterDispatcherArguments.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ private[mesos] class MesosClusterDispatcherArguments(args: Array[String], conf:
4444
port = value
4545
parse(tail)
4646

47-
case ("--webui-port" | "-p") :: IntParam(value) :: tail =>
47+
case ("--webui-port") :: IntParam(value) :: tail =>
4848
webUiPort = value
4949
parse(tail)
5050

core/src/main/scala/org/apache/spark/scheduler/cluster/mesos/CoarseMesosSchedulerBackend.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ private[spark] class CoarseMesosSchedulerBackend(
147147
sc.sparkUser,
148148
sc.appName,
149149
sc.conf,
150-
sc.ui.map(_.appUIAddress))
150+
sc.conf.getOption("spark.mesos.driver.webui.url").orElse(sc.ui.map(_.appUIAddress))
151+
)
151152
startScheduler(driver)
152153
}
153154

core/src/main/scala/org/apache/spark/scheduler/cluster/mesos/MesosSchedulerBackend.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ private[spark] class MesosSchedulerBackend(
7777
sc.sparkUser,
7878
sc.appName,
7979
sc.conf,
80-
sc.ui.map(_.appUIAddress))
80+
sc.conf.getOption("spark.mesos.driver.webui.url").orElse(sc.ui.map(_.appUIAddress))
81+
)
8182
startScheduler(driver)
8283
}
8384

core/src/test/scala/org/apache/spark/scheduler/cluster/mesos/CoarseMesosSchedulerBackendSuite.scala

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,35 @@ class CoarseMesosSchedulerBackendSuite extends SparkFunSuite
208208
verify(driver, times(1)).killTask(createTaskId("0"))
209209
}
210210

211+
test("weburi is set in created scheduler driver") {
212+
setBackend()
213+
val taskScheduler = mock[TaskSchedulerImpl]
214+
when(taskScheduler.sc).thenReturn(sc)
215+
val driver = mock[SchedulerDriver]
216+
when(driver.start()).thenReturn(Protos.Status.DRIVER_RUNNING)
217+
val securityManager = mock[SecurityManager]
218+
219+
val backend = new CoarseMesosSchedulerBackend(taskScheduler, sc, "master", securityManager) {
220+
override protected def createSchedulerDriver(
221+
masterUrl: String,
222+
scheduler: Scheduler,
223+
sparkUser: String,
224+
appName: String,
225+
conf: SparkConf,
226+
webuiUrl: Option[String] = None,
227+
checkpoint: Option[Boolean] = None,
228+
failoverTimeout: Option[Double] = None,
229+
frameworkId: Option[String] = None): SchedulerDriver = {
230+
markRegistered()
231+
assert(webuiUrl.isDefined)
232+
assert(webuiUrl.get.equals("http://webui"))
233+
driver
234+
}
235+
}
236+
237+
backend.start()
238+
}
239+
211240
private def verifyDeclinedOffer(driver: SchedulerDriver,
212241
offerId: OfferID,
213242
filter: Boolean = false): Unit = {
@@ -311,6 +340,7 @@ class CoarseMesosSchedulerBackendSuite extends SparkFunSuite
311340
.setMaster("local[*]")
312341
.setAppName("test-mesos-dynamic-alloc")
313342
.setSparkHome("/path")
343+
.set("spark.mesos.driver.webui.url", "http://webui")
314344

315345
if (sparkConfVars != null) {
316346
for (attr <- sparkConfVars) {

core/src/test/scala/org/apache/spark/scheduler/cluster/mesos/MesosSchedulerBackendSuite.scala

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,41 @@ import org.apache.spark.{LocalSparkContext, SparkConf, SparkContext, SparkFunSui
4242

4343
class MesosSchedulerBackendSuite extends SparkFunSuite with LocalSparkContext with MockitoSugar {
4444

45+
test("weburi is set in created scheduler driver") {
46+
val conf = new SparkConf
47+
conf.set("spark.mesos.driver.webui.url", "http://webui")
48+
conf.set("spark.app.name", "name1")
49+
50+
val sc = mock[SparkContext]
51+
when(sc.conf).thenReturn(conf)
52+
when(sc.sparkUser).thenReturn("sparkUser1")
53+
when(sc.appName).thenReturn("appName1")
54+
55+
val taskScheduler = mock[TaskSchedulerImpl]
56+
val driver = mock[SchedulerDriver]
57+
when(driver.start()).thenReturn(Protos.Status.DRIVER_RUNNING)
58+
59+
val backend = new MesosSchedulerBackend(taskScheduler, sc, "master") {
60+
override protected def createSchedulerDriver(
61+
masterUrl: String,
62+
scheduler: Scheduler,
63+
sparkUser: String,
64+
appName: String,
65+
conf: SparkConf,
66+
webuiUrl: Option[String] = None,
67+
checkpoint: Option[Boolean] = None,
68+
failoverTimeout: Option[Double] = None,
69+
frameworkId: Option[String] = None): SchedulerDriver = {
70+
markRegistered()
71+
assert(webuiUrl.isDefined)
72+
assert(webuiUrl.get.equals("http://webui"))
73+
driver
74+
}
75+
}
76+
77+
backend.start()
78+
}
79+
4580
test("Use configured mesosExecutor.cores for ExecutorInfo") {
4681
val mesosExecutorCores = 3
4782
val conf = new SparkConf

docs/running-on-mesos.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,22 @@ See the [configuration page](configuration.html) for information on Spark config
390390
</ul>
391391
</td>
392392
</tr>
393+
<tr>
394+
<td><code>spark.mesos.driver.webui.url</code></td>
395+
<td><code>(none)</code></td>
396+
<td>
397+
Set the Spark Mesos driver webui_url for interacting with the framework.
398+
If unset it will point to Spark's internal web UI.
399+
</td>
400+
</tr>
401+
<tr>
402+
<td><code>spark.mesos.dispatcher.webui.url</code></td>
403+
<td><code>(none)</code></td>
404+
<td>
405+
Set the Spark Mesos dispatcher webui_url for interacting with the framework.
406+
If unset it will point to Spark's internal web UI.
407+
</td>
408+
</tr>
393409
</table>
394410

395411
# Troubleshooting and Debugging

0 commit comments

Comments
 (0)