spark Master是spark集羣的首腦,負責資源調度,任務分配,負載平衡等功能web
如下是master啓動流程概述shell
經過shell進行對master進行啓動apache
首先看一下啓動腳本more start-master.sh jvm
此時咱們知道最終調用的是org.apache.spark.deploy.master.Mastertcp
這是Master源碼:函數
private[spark] object Master extends Logging { val systemName = "sparkMaster" private val actorName = "Master" //master啓動的入口 def main(argStrings: Array[String]) { SignalLogger.register(log) //建立SparkConf val conf = new SparkConf //保存參數到SparkConf val args = new MasterArguments(argStrings, conf) //建立ActorSystem和Actor val (actorSystem, _, _, _) = startSystemAndActor(args.host, args.port, args.webUiPort, conf) //等待結束 actorSystem.awaitTermination() } /** * Returns an `akka.tcp://...` URL for the Master actor given a sparkUrl `spark://host:port`. * * @throws SparkException if the url is invalid */ def toAkkaUrl(sparkUrl: String, protocol: String): String = { val (host, port) = Utils.extractHostPortFromSparkUrl(sparkUrl) AkkaUtils.address(protocol, systemName, host, port, actorName) } /** * Returns an akka `Address` for the Master actor given a sparkUrl `spark://host:port`. * * @throws SparkException if the url is invalid */ def toAkkaAddress(sparkUrl: String, protocol: String): Address = { val (host, port) = Utils.extractHostPortFromSparkUrl(sparkUrl) Address(protocol, systemName, host, port) } /** * Start the Master and return a four tuple of: * (1) The Master actor system * (2) The bound port * (3) The web UI bound port * (4) The REST server bound port, if any */ def startSystemAndActor( host: String, port: Int, webUiPort: Int, conf: SparkConf): (ActorSystem, Int, Int, Option[Int]) = { val securityMgr = new SecurityManager(conf) //利用AkkaUtils建立ActorSystem val (actorSystem, boundPort) = AkkaUtils.createActorSystem(systemName, host, port, conf = conf, securityManager = securityMgr) //經過ActorSystem建立Actor -> actorSystem.actorOf, 就會執行Master的構造方法->而後執行生命週期方法 val actor = actorSystem.actorOf( Props(classOf[Master], host, boundPort, webUiPort, securityMgr, conf), actorName) val timeout = AkkaUtils.askTimeout(conf) val portsRequest = actor.ask(BoundPortsRequest)(timeout) val portsResponse = Await.result(portsRequest, timeout).asInstanceOf[BoundPortsResponse] (actorSystem, boundPort, portsResponse.webUIPort, portsResponse.restPort) } }
最終會經過Master的main函數進行最jvm進程啓動url