Spark源码分析-Master的onStart()方法是什么时候调用的?

博客探讨了Spark Master的onStart()方法何时被调用的问题。尽管在Master的main方法中未直接调用onStart(),但通过深入分析Spark的Netty通信架构,发现它在创建NettyRpcEnv并初始化Dispatcher时被触发。Dispatcher的线程池处理消息时,会执行Inbox中的onStart事件,从而调用到Master的onStart()方法。
摘要由CSDN通过智能技术生成

一般我们都知道,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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值