aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorGang Wu <wgtmac@uber.com>2016-09-29 15:51:05 -0400
committerAndrew Or <andrewor14@gmail.com>2016-09-29 15:51:38 -0400
commitcb87b3ced9453b5717fa8e8637b97a2f3f25fdd7 (patch)
tree19f7155fe954e68467cbe41e69f7b032391b92cc /core
parent7f779e7439127efa0e3611f7745e1c8423845198 (diff)
downloadspark-cb87b3ced9453b5717fa8e8637b97a2f3f25fdd7.tar.gz
spark-cb87b3ced9453b5717fa8e8637b97a2f3f25fdd7.tar.bz2
spark-cb87b3ced9453b5717fa8e8637b97a2f3f25fdd7.zip
[SPARK-17672] Spark 2.0 history server web Ui takes too long for a single application
Added a new API getApplicationInfo(appId: String) in class ApplicationHistoryProvider and class SparkUI to get app info. In this change, FsHistoryProvider can directly fetch one app info in O(1) time complexity compared to O(n) before the change which used an Iterator.find() interface. Both ApplicationCache and OneApplicationResource classes adopt this new api. manual tests Author: Gang Wu <wgtmac@uber.com> Closes #15247 from wgtmac/SPARK-17671.
Diffstat (limited to 'core')
-rw-r--r--core/src/main/scala/org/apache/spark/deploy/history/ApplicationHistoryProvider.scala5
-rw-r--r--core/src/main/scala/org/apache/spark/deploy/history/FsHistoryProvider.scala4
-rw-r--r--core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala4
-rw-r--r--core/src/main/scala/org/apache/spark/status/api/v1/ApiRootResource.scala1
-rw-r--r--core/src/main/scala/org/apache/spark/status/api/v1/OneApplicationResource.scala2
-rw-r--r--core/src/main/scala/org/apache/spark/ui/SparkUI.scala4
6 files changed, 19 insertions, 1 deletions
diff --git a/core/src/main/scala/org/apache/spark/deploy/history/ApplicationHistoryProvider.scala b/core/src/main/scala/org/apache/spark/deploy/history/ApplicationHistoryProvider.scala
index 44661edfff..ba42b4862a 100644
--- a/core/src/main/scala/org/apache/spark/deploy/history/ApplicationHistoryProvider.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/history/ApplicationHistoryProvider.scala
@@ -109,4 +109,9 @@ private[history] abstract class ApplicationHistoryProvider {
@throws(classOf[SparkException])
def writeEventLogs(appId: String, attemptId: Option[String], zipStream: ZipOutputStream): Unit
+ /**
+ * @return the [[ApplicationHistoryInfo]] for the appId if it exists.
+ */
+ def getApplicationInfo(appId: String): Option[ApplicationHistoryInfo]
+
}
diff --git a/core/src/main/scala/org/apache/spark/deploy/history/FsHistoryProvider.scala b/core/src/main/scala/org/apache/spark/deploy/history/FsHistoryProvider.scala
index 6874aa5f93..d494ff0659 100644
--- a/core/src/main/scala/org/apache/spark/deploy/history/FsHistoryProvider.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/history/FsHistoryProvider.scala
@@ -224,6 +224,10 @@ private[history] class FsHistoryProvider(conf: SparkConf, clock: Clock)
override def getListing(): Iterable[FsApplicationHistoryInfo] = applications.values
+ override def getApplicationInfo(appId: String): Option[FsApplicationHistoryInfo] = {
+ applications.get(appId)
+ }
+
override def getAppUI(appId: String, attemptId: Option[String]): Option[LoadedAppUI] = {
try {
applications.get(appId).flatMap { appInfo =>
diff --git a/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala b/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
index c178917d8d..735aa43cfc 100644
--- a/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
@@ -182,6 +182,10 @@ class HistoryServer(
getApplicationList().iterator.map(ApplicationsListResource.appHistoryInfoToPublicAppInfo)
}
+ def getApplicationInfo(appId: String): Option[ApplicationInfo] = {
+ provider.getApplicationInfo(appId).map(ApplicationsListResource.appHistoryInfoToPublicAppInfo)
+ }
+
override def writeEventLogs(
appId: String,
attemptId: Option[String],
diff --git a/core/src/main/scala/org/apache/spark/status/api/v1/ApiRootResource.scala b/core/src/main/scala/org/apache/spark/status/api/v1/ApiRootResource.scala
index de927117e1..17bc04303f 100644
--- a/core/src/main/scala/org/apache/spark/status/api/v1/ApiRootResource.scala
+++ b/core/src/main/scala/org/apache/spark/status/api/v1/ApiRootResource.scala
@@ -222,6 +222,7 @@ private[spark] object ApiRootResource {
private[spark] trait UIRoot {
def getSparkUI(appKey: String): Option[SparkUI]
def getApplicationInfoList: Iterator[ApplicationInfo]
+ def getApplicationInfo(appId: String): Option[ApplicationInfo]
/**
* Write the event logs for the given app to the [[ZipOutputStream]] instance. If attemptId is
diff --git a/core/src/main/scala/org/apache/spark/status/api/v1/OneApplicationResource.scala b/core/src/main/scala/org/apache/spark/status/api/v1/OneApplicationResource.scala
index d7e6a8b589..18c3e2f407 100644
--- a/core/src/main/scala/org/apache/spark/status/api/v1/OneApplicationResource.scala
+++ b/core/src/main/scala/org/apache/spark/status/api/v1/OneApplicationResource.scala
@@ -24,7 +24,7 @@ private[v1] class OneApplicationResource(uiRoot: UIRoot) {
@GET
def getApp(@PathParam("appId") appId: String): ApplicationInfo = {
- val apps = uiRoot.getApplicationInfoList.find { _.id == appId }
+ val apps = uiRoot.getApplicationInfo(appId)
apps.getOrElse(throw new NotFoundException("unknown app: " + appId))
}
diff --git a/core/src/main/scala/org/apache/spark/ui/SparkUI.scala b/core/src/main/scala/org/apache/spark/ui/SparkUI.scala
index 39155ff264..ef71db8979 100644
--- a/core/src/main/scala/org/apache/spark/ui/SparkUI.scala
+++ b/core/src/main/scala/org/apache/spark/ui/SparkUI.scala
@@ -126,6 +126,10 @@ private[spark] class SparkUI private (
))
))
}
+
+ def getApplicationInfo(appId: String): Option[ApplicationInfo] = {
+ getApplicationInfoList.find(_.id == appId)
+ }
}
private[spark] abstract class SparkUITab(parent: SparkUI, prefix: String)