Spark原始碼閱讀之HistoryServer

2021-09-30 14:33:49 字數 2797 閱讀 8628

概述

historyserver服務可以讓使用者通過spark ui介面,檢視歷史應用(已經執行完的應用)的執行細節,比如job資訊、stage資訊、task資訊等,該功能是基於spark eventlogs日誌檔案的,所以必須開啟eventlogs日誌開關,關於日誌開關的開啟和historyserver服務的啟動方法這裡不再講述,下面進入正題

下面使用的spark版本是2.0.2

類結構圖

web相關

資料流相關

相關類及特質

webui

web server服務中ui層次結構的最頂層。每乙個webui包含了乙個tabs的集合,而每乙個tab又包含了乙個pages的集合。tabs頁是可選的,而且webui也可以直接新增page

繼承該特質的有sparkui、masterwebui、workerwebui和historyserver,在這裡我們主要介紹historyserver

webuitab

乙個tab包含了乙個pages的集合。prefix通過追加到parent的url組成乙個完整的url path,而且不能包含斜槓

繼承該特質有jobstab、stagestab、executorstab、storagetab等(這裡沒有列全),對應於spark ui介面上的jobs、stages、executors、storage等tab頁

webuipage

乙個page表示ui層次結構中的葉子節點。webuipage的直接父類即可以是webui,也可以是webuitab。

如果父類是webui,prefix追加到parent的url形成完整的url path,如果父類是webuitab,prefix追加到parent的prefix形成乙個相對url path。prefix中不能包含斜槓

繼承該特質的有jobpage、stagepage、executionpage、storagepage等,對應於tab頁中具體的page

historypage

繼承至webuipage,通過render函式渲染生成history頁面

uiroothistoryserver

def

main

(argstrings: array[string]): unit =

// wait until the end of the world... or

if the historyserver process is manually stopped

while(true)

}

在historyserver例項化的過程中,會執行initialize()函式,

def initialize()
在該函式中,首先通過attachpage函式在ui中新增了historypage例項,該例項負責渲染生成history page,然後通過attachhandler新增了不同的handler,可以訪問url路由獲取對應的資訊,其中apirootresource提供了api/vi/開頭的路由,通過該路由,history page可以獲取後台解析出的eventlog資訊用以呈現,資料通過uiroot提供的介面獲取

到這裡,historyserver的web端基本構建完成

hsitoryserver資料快取及獲取

資料快取主要通過使用google快取機制loadingcache實現,關於loadingcache在spark historyserver中的運用在另外一篇文章中分析

fshistoryprovider

private val pool = executors.newscheduledthreadpool(1, new threadfactorybuilder()

.setnameformat("spark-history-task-%d").setdaemon(true).build())

pool.schedulewithfixeddelay(getrunner(checkforlogs), 0, update_interval_s, timeunit.seconds)

if (conf.getboolean("spark.history.fs.cleaner.enabled", false))

for (file 

}

private def

replay

( eventlog: filestatus,

bus: replaylistenerbus,

val logpath = eventlog.getpath()

loginfo(s"replaying log path: $logpath")

val loginput = eventlogginglistener.openeventlog(logpath, fs)

try finally

}

spark原始碼剖析 RDD相關原始碼閱讀筆記

最好的原始碼閱讀方法就是除錯,沒有之一 之前其實有閱讀過rdd相關的原始碼,最近學習過程中發現在之前原本閱讀過的模組中有一些 關節 並沒有打通,所以想通過除錯的方式來更細緻得學習原始碼。本文為編寫測試用例並除錯rdd相關模組的筆記,並沒有列出具體的除錯過程,僅列出結論以做備忘,特別是那些比較容易忽略...

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...

原始碼閱讀 Glide原始碼閱讀之load方法(二)

原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...