spark 监控--WebUi、Metrics System(转载)
轉(zhuǎn)載自:https://www.cnblogs.com/barrenlake/p/4364644.html
Spark 監(jiān)控相關(guān)的部分有WebUi 及 Metrics System; WebUi用于展示Spark 資源狀態(tài)、Metrics System 整合的指標(biāo)信息。
Ui相關(guān)流程
Spark集群啟動之后,我們可以通過Web觀察集群狀態(tài)等信息,這一部分工作是Spark WebUi 模塊實現(xiàn)。
Servlet容器啟動:
Master創(chuàng)建時,會通過val?webUi =?new?MasterWebUI(this, webUiPort)創(chuàng)建webUi,
在啟動Master時(perStart()中)通過webUi.bind()啟動JettyServer,即Servlet容器。
Master的preStart()的源碼如下所示
又webUi.bind()的源碼如下所示:
WebUI頁面信息
創(chuàng)建的MasterWebUI初始化時會添加三個頁面和一個靜態(tài)資源處理器,其初始化代碼如下:
其中 attachPage方法代碼如下:
其在添加頁面時將初始化,頁面地址pagePath,創(chuàng)建并綁定請求處理器,以及指定響應(yīng)方法page.render(request).
其中createServletHandler實現(xiàn)如下:
此函數(shù)中會調(diào)用另一重載方法,其又會調(diào)用creatServlet方法,創(chuàng)建Servlet用于對外提供服務(wù)。createServlet方法代碼如下所示:
Servlet中doGet方法用來處理get請求, 具體業(yè)務(wù)邏輯由傳入的servletParams提供。
下面以attachPage(new?MasterPage(this))為例對servletParams進(jìn)行說明,由上文源碼示例attachPage可知 (request: HttpServletRequest) => page.render(request)為servletParams。此參數(shù)意為使用page.render(request)對request進(jìn)行處理。
MasterPage
MasterPage負(fù)責(zé)對master頁面的請求,請求路徑為http://master:webUiPort/或http://master:webUiPort/json.
?下面http://master:webUiPort/json請求進(jìn)行說明,當(dāng)servlet接收到請求后,通過page.renderJson對其進(jìn)行處理, renderJson源程序代碼如下:
通過分析源代碼可知:renderjson首先向master發(fā)送消息RequestMasterState,請求Master的狀態(tài)信息. 然后阻塞等待結(jié)果,然后將結(jié)果轉(zhuǎn)換成JSON格式、返回。
?Master收到RequestMasterState消息后:
將其狀態(tài)信息封裝成MasterStateResponse對象發(fā)送給請求者。
Spark MetricsSystem 運行機制
???????? Spark中的Metrics System 特殊的“實例”創(chuàng)建的,結(jié)合數(shù)據(jù)源、數(shù)據(jù)匯(接收點)的系統(tǒng),其作用是定期將數(shù)據(jù)指標(biāo)從數(shù)據(jù)源拉到數(shù)據(jù)匯。
實例(instance):創(chuàng)建Metrics的實例一般指使用Metrics System的角色。Spark中有多種角色,像master, worker, executor, client Driver,這些角色會創(chuàng)建Metrics System用于監(jiān)控。所以這里所說的“實例”代表這些角色。當(dāng)前,Spark中已實現(xiàn)的實例有:master,worker, executor,driver, applications.
數(shù)據(jù)源(source): 從哪里收集數(shù)據(jù)指標(biāo),在Metrics System中存在兩種類型的數(shù)據(jù)源:
???????? Spark 內(nèi)部源,像MasterSource, WorkerSource等,這些源會收集Spark組件的狀態(tài),它們與Spark中角色相關(guān),當(dāng)Metrics System創(chuàng)建后,它們會在Metrics System中注冊。
???????? 共用源,通過配制文件配制并通過反射機制進(jìn)行加載,會收集更底層的狀態(tài)指標(biāo),像JvmSource。
數(shù)據(jù)匯(sink):收集的數(shù)據(jù)指標(biāo)輸出的目的地,目的地可以是控制臺,Servlet等。
????????
下面以Master為入口對Metrics System工作機制做詳細(xì)說明:
?
伴隨Master的創(chuàng)建會創(chuàng)建MetricsSystem、MasterSource、WebUI等對象
在Master啟動時會執(zhí)行以下動作:
綁定WebUI
將MasterSource注冊到Metrics中,
啟動MetricsSystem,并將其servlethandler綁定到WebUI.
MetricsConfig
創(chuàng)建MetricsConfig時會創(chuàng)建并初始化MetricsConfig, MetricsConfig將持有一個HashMap類型的propertyCategories,其用來存放處理過的屬性集合。再獲取MetricsConfig實例時都將會從此屬性中取相應(yīng)的MetricsConfig配制.如下代碼所示:若存在指定key的屬性,則返回;否則返回默認(rèn)值。
propertyCategories將在MetricsConfig初始化時(initialize())調(diào)用時對其賦值,初始化過程如下:
?防止沒有屬性文件,添加默認(rèn)屬性。
檢測spark.metrics.conf是否設(shè)置,若未設(shè)置則試著去classpath下尋找”metrics.properties”文件。若存在配制文件,則將其屬性載入properties。
?然后將properties中內(nèi)容進(jìn)行抽取、分類、歸并處理,其代碼如下:
若不存在配制文件的情況下,系統(tǒng)只有默認(rèn)添加屬性,經(jīng)上述代碼處理的結(jié)果為:
applications -> {sink.servlet.class=org.apache.spark.metrics.sink.MetricsServlet, sink.servlet.path=/metrics/applications/json}master -> {sink.servlet.class=org.apache.spark.metrics.sink.MetricsServlet, sink.servlet.path=/metrics/master/json}* -> {sink.servlet.class=org.apache.spark.metrics.sink.MetricsServlet, sink.servlet.path=/metrics/json}其中subProperties()方法是對properties屬性進(jìn)行抽取、規(guī)類。代碼如下:
注冊數(shù)據(jù)源: MetricsSystem啟動時
當(dāng)MetricsSystem 在啟動時將會調(diào)用注冊數(shù)據(jù)源函數(shù)registerSources(),注冊實例相關(guān)的所有數(shù)據(jù)源。
上面是registerSources相關(guān)代碼,其通過getInstance()方法獲取該instance相關(guān)的配制屬性。然后通過subProperties方法進(jìn)行抽取、歸類。然后取出key為class的屬性,利用java反射機制創(chuàng)建Source對象并進(jìn)行注冊。默認(rèn)情況下不存在Source相關(guān)屬性,所以此例中MasterSource唯一數(shù)據(jù)源。
?其通過MetricsConfig的getInstance()方法。該方法會以傳入的instance做為key 去propertyCategories中取屬性值
注冊數(shù)據(jù)匯(目的地)
MetricsSystem的start()方法通過調(diào)用registerSinks()方法來注冊數(shù)據(jù)匯(數(shù)據(jù)指標(biāo)接收點)。程序代碼如下所示:
?
通過分析此方法的源碼,若未通過配制文件指定MetricsConfig屬性,則將只通過反射創(chuàng)建MetricsServlet,其內(nèi)部再創(chuàng)建ServletHander交付WebUI使用。但此MetricsServlet并未做為sink添加到sinks列表,至此 sinks列表仍為空,MetricsSystem的start()方法中調(diào)用sinks.foreach(_.start)時將不執(zhí)行任何動作。換句話說,在默認(rèn)情況下,registerSinks方法只是對MetricsServlet進(jìn)行實例化用。
MetricsServlet的創(chuàng)建
???????? MetricsSystem在注冊Sink時, 會創(chuàng)建MetricsServlet, MetricsServlet的映射地址為propertyCategories是path屬性對應(yīng)項,其做為一個web服務(wù),用于對相應(yīng)請求進(jìn)行處理。 MetricsServlet會通過調(diào)用jettyUtils的createServletHandler方法ServletContextHandler,創(chuàng)建Handler。其核心代碼如下:
此方法將創(chuàng)建以/metrics/master/json為請求路徑的httpServlet, 影響類型為JSON串。
然后并將創(chuàng)建的Hander賦值給通過MetircsSystem的getServletHander方法交由WebUi處理。
getServletHander方法程序代碼如下所示:
?
轉(zhuǎn)載于:https://www.cnblogs.com/itboys/p/11122177.html
總結(jié)
以上是生活随笔為你收集整理的spark 监控--WebUi、Metrics System(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.MySQL中的索引
- 下一篇: 用python实现时间的动态(动态时钟)