問題
- 在Spark的standalone 模式中Master是如何啟動?
- 在Master啟動后又做了哪些操作份企?
Master啟動流程
從Spark2.0開始就以及刪除了akka的相關(guān)通信代碼,所以3.0的rpc通訊采用的還是2.0之后的Netty來作為底層通訊框架巡莹;SparkMaster的啟動類(org.apache.spark.deploy.master.Master.scala)司志,在這個class中的main函數(shù)是啟動Master的開始,我們就從這里開始降宅。
主要啟動流程如下:
- 設(shè)置多線程的異常處理器
- 獲取和解析SparkMaster參數(shù)信息
- 啟動RpcEnv
- 注冊Endpoint
- 等待Master優(yōu)雅關(guān)閉
1. 設(shè)置多線程的異常處理器
因在多線程中其異常無法準(zhǔn)備獲取骂远,需要進(jìn)行設(shè)置線程的異常處理器來進(jìn)行處理.
2. 獲取和解析SparkMaster的參數(shù)信息
在SparkConf中主要從系統(tǒng)的環(huán)境變量中加載因spark開頭的環(huán)境變量參數(shù)
解析的參數(shù)信息會存放在settings中。
而MasterArguments主要是用來解析Master啟動時通過args傳遞的參數(shù)腰根,以及Spark配置文件中的信息(默認(rèn)為SPARK_HOME/conf/spark-default.conf文件):
3. 啟動RpcEnv
在Master的main中會調(diào)用startRpcEnvAndEndpoint激才,這個函數(shù)來負(fù)責(zé)啟動Rpc并注冊Endpoint(Master)
其中SecurityManager主要是SparkConf中獲取是否啟用了安全和權(quán)限信息等。
接下來看看NetyRpcEnv是如何創(chuàng)建的RpcEnv的
1劣挫、先new出NettyRpcEnv實(shí)例,在NettyRpcEnv進(jìn)行構(gòu)造函數(shù)初始化時东帅,會初始化一些主要的類压固,如Dispatcher、TransportContext靠闭、NettyRpcHandler帐我,以及outbox。
2愧膀、判斷是否是客戶端模式拦键,非客戶端模式需要啟動服務(wù)器,主要用TransportContext來創(chuàng)建服務(wù)器
在啟動服務(wù)器時如果端口被占用狼钮,會按照算法進(jìn)行算出下一個端口碳柱,如果是測試模式,最大重試100次熬芜,非測試模式莲镣,最大重試16次,如果重試次數(shù)結(jié)束都無法創(chuàng)建服務(wù)器涎拉,則報錯瑞侮,啟動Master失敗。
4.注冊Endpoint(Master)
注冊Endpoint主要使用RpcEnv#setupEndpoint方法來完成注冊鼓拧,這個方法內(nèi)部又調(diào)用了Dispatcher的registerRpcEndpoint來進(jìn)行記錄Endpoint半火。當(dāng)注冊完成后會返回一個EndpointRef,后面可以用這個Ref來向Endpoint發(fā)送rpc請求季俩。
接下來開始構(gòu)造Master钮糖,當(dāng)構(gòu)造完成后會調(diào)用OnStart方法(在創(chuàng)建Dispatcher時,Dispatcher會初始化ShareMessageLoop酌住,當(dāng)注冊Endpoint時會用到MessageLoop#register函數(shù)店归,這個函數(shù)會對每個注冊的Endpoint都創(chuàng)建一個InBox,且在new InBox時酪我,會向里面放OnStart消息作為Endpoint的InBox的第一個消息)
在onStart方法中消痛,主要啟動web ui和rest server以及一些指標(biāo)系統(tǒng);和leader選舉等都哭。
當(dāng)master服務(wù)器啟動后秩伞,會使用EndpointRef向Master發(fā)送BoundPortsResponse消息來獲取Master啟動的web ui端口和rest端口逞带。
到此Master啟動完成,awaitTermination等待Master關(guān)閉纱新,這個是使用CountDownLatch來實(shí)現(xiàn)的展氓。
后面就等待Worker來連接、Driver來提交作業(yè)怒炸。