最近在阅读《图解Spark核心技术与案例实战》第4章Spark核心原理,4.1消息通信原理,感觉读到Spark运行时通信时开始看不懂,于是下载了Spark3.1.2,spark-core_2.12代码打算自己看一下源码,梳理一下架构原理及其实现方式。 源码中rpc通信主要包括以下几个重要的类和对象:
其中RpcEndpoint、RpcEndpoint和RpcEnv是特质,类似于Java中的抽象接口,netty中的具体的实现,Spark中的通信框架是netty,Netty是一个基于Java NIO的客户端服务器网络应用程序框架,可以快速开发高性能的网络应用程序。
名词解释
RPC(Remote Procedure Call)是远程过程调用的缩写,是一种通信协议,允许一台计算机上的程序调用另一台计算机上的程序,而不用关心网络通信细节。RPC在分布式系统中非常常用,因为它可以让程序员像调用本地函数一样来调用远程服务。 在Apache Spark中,RPC是用于在节点之间进行通信的机制。Spark使用Netty作为RPC框架,它可以让节点之间的通信更快、更可靠。在Spark中,RPC主要用于在Executor和Driver之间传输数据和调用方法。 例如,当Executor需要将数据传输到Driver时,它会使用RPC机制将数据发送到Driver。同样,当Driver需要调用Executor上的方法时,也会使用RPC机制进行调用。 总的来说,RPC是Spark中重要的通信机制,用于在节点之间传输数据和调用方法,从而帮助Spark实现分布式计算。
Netty是一个基于Java NIO的客户端服务器网络应用程序框架,可以快速开发高性能的网络应用程序。在Spark中,Netty被用作RPC框架,用于在Spark节点之间进行通信。
NIO可以被比喻成一个快速服务员,他可以同时处理多个客人的订单。他不会因为一个客人的订单太复杂而阻塞,而是会记录下来并在空闲时处理。这样,他就能同时处理多个客人的订单,让餐厅的效率大大提高。 BIO可以被比喻成一个细心的服务员,他会专心致志地处理一个客人的订单,直到完成为止。但是,如果客人的订单太复杂或者服务员太慢,那么其他的客人就必须等待。这样,餐厅的效率就会大大降低。
RpcEndpoint通信端点,Spark针对每个节点(Client、Master、Worker)都称之为一个RpcEndpoint,且都实现RpcEndpoint接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理。在Spark中,RpcEndpoint是每个节点上的一个逻辑实体,它代表着节点上的一个RPC服务。RpcEndpoint可以接收来自其他节点的RPC调用,也可以向其他节点发起RPC调用。
RpcEndpointRef是对远程 RpcEndpoint 的一个引用,当我们需要向一个具体的 RpcEndpoint 发送消息时,一般我们需要获取到该RpcEndpoint 的引用,然后通过该引用向该节点发送消息。
RpcEnv(RPC运行环境)是Spark中用于管理RPC的组件,负责创建RpcEndpoint、绑定RpcEndpoint到特定的地址、监听RPC调用并转发给RpcEndpoint等功能。RpcEnv是每个Spark节点上的一个单例对象,负责管理这个节点上的所有RpcEndpoint。RpcEnv通常是由Spark程序的主类(如SparkContext)来创建的。
Dispatcher消息分发器,将外部发送过来的消息分发给注册在RpcEnv中的RpcEndpoint端点,注意一个RpcEnv中注册管理多个RpcEndpoint端点,同时负责内部消息发送即给同一个RpcEnv中的其他RpcEndpoint发送消息。
MessageLoop消息循环,对于一个RpcEnv中接收到的消息会进入消息循环,由特定线程池中的线程进行消费处理,实际是一个链表,链表中的每个节点都是一个Inbox消息收件箱,一个Inbox对应一个RpcEndpoint端点。
Inbox消息收件箱,一个RpcEndpoint对应一个收件箱,内部维护一个messages链表,每当有消息进入MessageLoop中时会调用Inbox中的Process方法处理messages中的消息,实际是Inbox会调用对应的RpcEndpoint中的函数处理。
Outbox消息发件箱,一个RpcEndpoint对应多个发件箱,当一个RpcEndpoint想给远程的RpcEndpoint发送消息时就将消息放到Outbox中,该Outbox对应远程RpcEndpoint,Outbox中有一个传输客户端TransportClient负责具体的消息发送。
RpcHandler消息处理器,主要是负责处理由TransportClient发送过来的消息。
(想不到更好的解释 参考:blog.csdn.net/L_IRISRIIN/… )
架构模型
消息收发原理过程
针对外部传输客户端TransportClient发送过来的消息由RpcHandler进行处理,调用Dispatcher中的方法将消息放进MessageLoop消息循环,消息循环中会有线程池中的多个线程扫描消息循环,处理Inbox收件箱中的消息,根据Inbox中的消息找到对应的RpcEndpoint,调用RpcEndpoint端点中的方法处理该消息。如果一个RpcEndpoint想要给远程的RpcEndpoint端点发消息,先要得到远程RpcEndpoint的引用,通过该引用给远程节点发消息,具体的消息发送则是由引用中的传输客户端TransportClient发送。
(本节先梳理一下基础知识 下一节开始具体的源码阅读)