spark2.2.0源码阅读---spark core包 --- rpc模块

1、本文目标以及其它说明:

        本文或者本次系列主要是弄清楚spark.2.2.0版本中,spark core 包下rpc通信情况。从源代码上面看到,底层通信是用的netty,因为本系列以及本文是专项学习spark,故netty只会涉及到不会去讲解。在读源码前考虑到spark的体系结构有spark core / spark sql / spark streaming / spark machinelearning / spark graphx ,所有的都是依赖于spark core ,所以先从spark core 开始研究,又因为看源码的过程中脑子里老是在想底层通信是怎么回事,故首先就是从一个子项目的底层模块一个一个地突破。整体研究思路是模块中的数据结构,以及数据结构之间是什么关系,以及数据结构之间的算法。即(软件 = 数据结构 + 算法)

2、rpc 包下面的数据结构说明

        研究思路说明: 因为软件 = 数据结构+算法。算法是基于数据结构,所以会先研究数据结构。先从包里面最简单的数据结构开始,由简单到复杂的数据结构。包括数据结构签名、作用、以及封装抽象的类型等等。

       a: 样例类 RpcAddress:封装的是 IP+端口。

联想计算机网络:

    1 、由计算机网络可以知道,通过IP+端口我们就能够定位到网络中具体的某个进程,并能够和她通信,建立联系。

    2、因为是spark的RPC,通信用的协议是spark专有的。类比于HTTP协议

private[spark] case class RpcAddress(host: String, port: Int) {

  def hostPort: String = host + ":" + port

  /** Returns a string in the form of "spark://host:port". */
  def toSparkURL: String = "spark://" + hostPort

  override def toString: String = hostPort
}
b:样例类 RpcEndpointAddress 
  1、封装了RpcAddress以及Endpoint,通过本类即可定位到远端spark应用中的Endpoint.也就是说
通过RpcAddress定位到应用进程,通过本类定位到具体的通信组件。Endpoint后续会了解
private[spark] case class RpcEndpointAddress(rpcAddress: RpcAddress, name: String)
c:接口类 RpcCallContext
   1、在ask rpc通信过程中,消息发送到远端的endpoint后,需要对方通过回调的方式应答,那么回答就

需要用到本数据结构。会通过调用发送消息端endpoint的receive方法作为回复。

private[spark] trait RpcCallContext {
  /**
   * Reply a message to the sender. If the sender is [[RpcEndpoint]], its [[RpcEndpoint.receive]]
   * will be called.
   */
  def reply(response: Any): Unit
  /**
   * Report a failure to the sender.
   */
  def sendFailure(e: Throwable): Unit
  /**
   * The sender of this message.
   */
  def senderAddress: RpcAddress
}
d:RpcEndpoint 这个是RPC通信的终端数据结构,消息到这里了就会进行处理。

       1、有个字段是RpcEnv,Rpc通信的环境。RpcEndpoint会到环境里面注册,并返回对应的RpcEndpointRef

        2、消息到了这里,更多的是消费以及回复(receive,receiveAndReply方法)以及包括连接、其它生命周期方法

   e:RpcEndpointRef 对于远端endpoint的引用,方便用来对远端的对应endpoint节点通信,线程安全的

      1、name(String) 字段是对应endpoint的名称,address(RpcAddress)

      2、用来发送消息。send() / ask ,一个不需要回复,一个需要,另外等待回复的有同步异步ask方法

   f:RpcEnv rpc通信的环境父类, 封装了通信是时需要用到的数据结构

     1、本类是注册rpcendpoint 并且返回rpcendpointref 。 

     2、将endpointref或者远端发来的消息路由到相应的endpoint上去,

     3、捕获异常(RpcCallContext.sendFailure),将异常发送回sender

   g:Dispatcher ,将消息路由到对应的endpoint上面

   h:Inbox,每个endpoint实例对应一个Inbox实例,里面装有endpoint,以及对应ref的引用,装的就是InboxMessage消息

说直白点就是让endpoint消费消息的容器。

   i:NettyRpcEnv,继承了RpcEnv,在此基础上,维护了<RpcAddress, OutBox>键值对。

     1、本类用来发送消息,send/ask方法。去本地的话调用的是dispatcher,然后放到Inbox里面,去远端的话是放在远端的outbox里面。然后由Outbox的发送方法发送,最后其实是调用的消息的自己的endwith方法,里面又是调用的TransportClient的发送方法。

   j:NettyStreamManager,主要是用来维护了由SparkContext提交到RpcEnv里面的文件、jar、和目录。

private val files = new ConcurrentHashMap[String, File]()
private val jars = new ConcurrentHashMap[String, File]()
private val dirs = new ConcurrentHashMap[String, File]()

   k:Outbox,每个远端地址对应一个。当发送消息时候,讲消息存放到对应Outbox里面,最后由TransportClient发送过去即可。

   l:RpcEndpointVerifier,只用来查看远端是否存在对应的endpoint,而且这个是存放在Dispatcher数据结构里面

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值