Spark2.0.2源码分析——Client 与 Master 之间创建 RPC 通信实例

standalone - cluster 模式为例
SparkSubmit提交任务 mainMethod 开始执行:

object Client {
  def main(args: Array[String]) {
    // scalastyle:off println
    if (!sys.props.contains("SPARK_SUBMIT")) {
      println("WARNING: This client is deprecated and will be removed in a future version of Spark")
      println("Use ./bin/spark-submit with \"--master spark://host:port\"")
    }
    // scalastyle:on println

    val conf = new SparkConf()
    val driverArgs = new ClientArguments(args)

    conf.set("spark.rpc.askTimeout", "10")
    Logger.getRootLogger.setLevel(driverArgs.logLevel
    //初始化 rpcEnv
    val rpcEnv =
      RpcEnv.create("driverClient", Utils.localHostName(), 0, conf, new SecurityManager(conf))
    //获得和Master通信的RPCEndpointRef,实际上是一个Seq[RpcEndpointRef]
    val masterEndpoints = driverArgs.masters.map(RpcAddress.fromSparkURL).
      map(rpcEnv.setupEndpointRef(_, Master.ENDPOINT_NAME))
    //注册ClientEndpoint
    rpcEnv.setupEndpoint("client", new ClientEndpoint(rpcEnv, driverArgs, masterEndpoints, conf))

    rpcEnv.awaitTermination()
  }
}

val rpcEnv = RpcEnv.create("driverClient", Utils.localHostName(), 0, conf, new SecurityManager(conf)):

这里是引用
在这里插入图片描述

val masterEndpoints = driverArgs.masters.map(RpcAddress.fromSparkURL). map(rpcEnv.setupEndpointRef(_, Master.ENDPOINT_NAME)):

这里是引用

rpcEnv.setupEndpoint("client", new ClientEndpoint(rpcEnv, driverArgs, masterEndpoints, conf)):

ClientEndpoint 不是个 RpcEndpoint 嘛,封装了很多处理消息的方法在这里插入图片描述这里是引用
在这里插入图片描述

注意这里的 val data = endpoints.get(name) endpointRefs.put(data.endpoint, data.ref)receiver.offer(data)val data = endpoints.get(name) 将获取与 name 对应的先前通过 new EndpointData(name, endpoint, endpointRef) 创建好的 EndpointDataendpointRefs.put(data.endpoint, data.ref) 添加两者映射关系,然后 receiver.offer(data)data 添加到 receivers队列 ,并且会触发 Dispatcher 内部的 MessageLoop 线程去消费,还有这里的 endpointRef 是属于 ClientEndpoint 的,显而易见嘛,传参的时候就传的 ClientEndpoint在这里插入图片描述
随后就会通过 ClientEndpointendpointRef 来调用 inbox 中的 OnStart 方法,这是它的本质,为什么这个信息类型是 OnStart :因为初始化 EndpointDatainbox 时,自动放置了一个 OnStart 消息,所以空的 Endpoint 对象对应于 OnStart:
在这里插入图片描述

这个写过详细解释,看这里:Spark2.0.2源码分析——RPC 通信机制(消息处理)
最终会在 client 中,也就是 ClientEndpoint 中调用 OnStart
这里是引用
先前不是得到了 Master 端的 EndpointRef 嘛,通过 RequestSubmitDriverMaster 异步发送提交请求,当然,这也是后话了~

猜你喜欢

转载自blog.csdn.net/qq_39327985/article/details/88317394