// Initialize the Spark UIprivate[spark] val ui: Option[SparkUI] = if (conf.getBoolean("spark.ui.enabled", true)) { Some(SparkUI.createLiveUI(this, conf, listenerBus, jobProgressListener, env.securityManager,appName)) } else { // For tests, do not enable the UI None }// Bind the UI before starting the task scheduler to communicate// the bound port to the cluster manager properlyui.foreach(_.bind())
def createLiveUI( sc: SparkContext, conf: SparkConf, listenerBus: SparkListenerBus, jobProgressListener: JobProgressListener, securityManager: SecurityManager, appName: String): SparkUI = { create(Some(sc), conf, listenerBus, securityManager, appName, jobProgressListener = Some(jobProgressListener))}
進入create方法:
進入SparkUI:
SparkUI 繼承了WebUI:
而WebUI類定義了def initialize()方法
SparkUI的initialize()實現(xiàn)方法:
上面代碼分析:增加頁面的tab頁面
1、JobsTab:
2、stagesTab:
3、StorageTab:
4、EnvironmentTab:
5、ExecutorsTab:
6、createStaticHandler:
7、createRedirectHandler:
當執(zhí)行完initialize()方法后,我們回到SparkContext 的Initialize the spark UI:
bind port:
從上面代碼可以看出來,啟動了端口號為4040的本地JettyServer
上面代碼分析:
1、創(chuàng)建ContextHandlerCollection并將handlers設置到ContextHandlerCollection中
2、增加一個filter:
3、創(chuàng)建Jetty Server并綁定端口號并創(chuàng)建一個QueuedThreadPool,設置到Server中:
4、啟動Jetty server,如果啟動失敗,就拋出異常:
5、試著重試幾次啟動startServiceOnPort,如果啟動失敗,就更換新端口號(規(guī)則是1+oldPort),重新啟動:
最終啟動成功后,會把信息東西存放在ServerInfo中:
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com