spark源码分析,master如何开启,master和worker是怎么通信

master的开启,开启了master,会在本机开启master netty服务端,用来接收远程或者本地客户端发送数据,再对master服务进行绑定。
开启流程如worker的开启流程:https://blog.csdn.net/LinkStars/article/details/112982187 spark源码学习 -worker启动消息通信,inbox,outbox创建

netty 服务端发送消息:
master消息接收会存放到master 的inbox中,master 的inbox会不断轮询进行process,master端点处理消息,处理完成,首先master把消息放置到自己的outbox中,拿到远程端点ref,发送时,创建连接远程worker netty 客户端,去连接worker 的 netty 服务端,向其发送消息,远程再把消息放置worker 的inbox中。

不管master开启,worker 的开启以及executor开启都是会开启自己本地netty服务端。master和worker的开启时开启jvm进程,当worker中的executor(executor创建在worker jvm进程中开启线程,帮助开启子进程CoarseGrainedExecutorBackend)需要通信,是创建远程连接netty client端与其通信。

master类:
def main(argStrings: Array[String]): Unit = {
val (rpcEnv, _, _) = startRpcEnvAndEndpoint(args.host, args.port, args.webUiPort, conf)
rpcEnv.awaitTermination()
}
def startRpcEnvAndEndpoint( host: String, port: Int,webUiPort: Int, conf: SparkConf): (RpcEnv, Int, Option[Int]) = {
val rpcEnv = RpcEnv.create(SYSTEM_NAME, host, port, conf, securityMgr)//这里开启nettty 服务端
val masterEndpoint = rpcEnv.setupEndpoint(ENDPOINT_NAME,
new Master(rpcEnv, rpcEnv.address, webUiPort, securityMgr, conf)) //开启master 服务,创建inbox收件箱,首先处理 endpoint.onStart(),master的onStart方法
val portsResponse = masterEndpoint.askSyncBoundPortsResponse//case BoundPortsRequest 回复
context.reply(BoundPortsResponse(address.port, webUi.boundPort, restServerBoundPort))
(rpcEnv, portsResponse.webUIPort, portsResponse.restPort)
}

executor创建在worker jvm进程中开启线程。如下:
worker类:
executors(appId + “/” + execId) = manager
manager.start()
ExecutorRunner类中
private[worker] def start(): Unit = {
workerThread = new Thread("ExecutorRunner for " + fullId) {
override def run(): Unit = { fetchAndRunExecutor() }
}
作者:小亦
好好学习,天天向上

你可能感兴趣的:(spark,core,源码分析,spark)