一般我们都知道,Master的生命周期方法为:constructor->onstart->receive*->onStop;但是在Master的main方法中并没有对onStart的直接调用,那么onStart方法是什么时候被调用的呢?
这其实与Spark的底层的Netty通信架构有关。
在Master的main方法中:
val rpcEnv: RpcEnv = RpcEnv.create(SYSTEM_NAME, host, port, conf, securityMgr)
当调用RpcEnv的create()方法时,会最终初始化并且执行NettyRpcEnv并且最终将这个对象返回。
那么我们再来看一下NettyRpcEnv的源码:
private[netty] class NettyRpcEnv(
val conf: SparkConf,
javaSerializerInstance: JavaSerializerInstance,
host: String,
securityManager: SecurityManager) extends RpcEnv(conf) with Logging{
private[netty] val transportConf = SparkTransportConf.fromSparkConf(
conf.clone.set("spark.rpc.io.numConnectionsPerPeer", "1"),
"rpc",
conf.getInt("spark.rpc.io.threads", 0))
// 创建消息分发器, 会创建一个收件箱. 可以提升异步处理消息的能力 ->
private val dispatcher: Dispatcher = new Dispatcher(this)
......
}
我们再来看一下Dispatcher的源码:
/**
* A message dispatcher, responsible for routing RPC messages to the appropriate endpoint(s).
* 消息分发器, 负责路由RPC消息到一个或多个合适的Endpoint
*/
private[netty] class Dispatcher(nettyEnv: NettyRpcEnv) extends Logging {
// 端点数据: 端点名, 端点, EndpointRef
private class EndpointData(
val name: String,
val endpoint: RpcEndpoint,
val ref: NettyRpcEndpoi