Spark 中通讯架构

一、Spark 通信架构介绍

Spark 中通信框架的发展:
1、Spark 早期版本中采用 Akka 作为内部通信部件。
2、Spark 1.3 中引入 Netty 通信框架,为了解决 Shuffle 的大数据传输问题使用。
3、Spark 1.6 中 Akka 和 Netty 可以配置使用,Netty 完全实现了 Akka 在 Spark 中的功能。
4、Spark 2 系列中,不再使用 Akka,使用 Netty。

二、Spark 通讯架构解析

架构图为:

1、RpcEndpoint
RPC 通信终端,Spark 针对每个节点(Client/Master/Worker) 都称之为一个 RPC 终端,且都实现 RpcEndpoint 接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果需要发送(询问)则调用 Dispatcher。在 Spark 中,所有的终端都存在生命周期:
(1) Constructor
(2) onStart
(3) receive
(4) onStop

2、RpcEnv
RPC 上下文环境,每个 RPC 终端运行时依赖的上下文环境称为 RpcEnv。

3、Dispatcher
消息调度(分发)器,针对于 RPC 终端需要发送远程消息或者从远程 RPC 接收到的消息,分发至对应的指令收件箱(发件箱)。如果指令接收方是自己则存入收件箱,如果指令接收方不是自己,则放入发件箱。

4、Inbox
指令消息收件箱,一个本地 RpcEndpoint 对应一个收件箱,Dispatcher 在每次向 Inbox 存入消息时,都将对应 EndpointData 加入内部 ReceiverQueue 中,另外 Dispatcher 创建时会启动一个单独线程进行轮询 ReceiverQueue,进行收件箱消息消费。

5、RpcEndpointRef
RpcEndpointRef,是对远程 RpcEndpoint 的一个引用,当我们需要向一个具体的 RpcEndpoint 发送消息时,一般我们需要获取到该 RpcEndpoint 的引用,然后通过该应用发送消息。

6、OutBox
指令消息发件箱,对于当前 RpcEndpoint 来说,一个目标 RpcEndpoint 对应一个发件箱,如果向多个目标 RpcEndpoint 发送信息,则有多个 OutBox。当消息放入 Outbox 后,紧接着通过 TransportClient 将消息发送出去。消息放入发件箱以及发送过程是在同一个线程中进行。

7、RpcAddress
表示远程的 RpcEndpointRef 的地址,Host + Port。

8、TransportClient
Netty 通信客户端,一个 OutBox 对应一个 TransportClient,TransportClient 不断轮询 OutBox,根据 OutBox 消息的 receiver 信息,请求对应的远程 TransportServer。

9、TransportServer
Netty 通信服务端,一个 RpcEndpoint 对应一个TransportServer,接受远程消息后调用 Dispatcher 分发消息至对应收发件箱。

你可能感兴趣的:(spark,java,netty,分布式,rpc,spark)