Spark 内核 (三) ——— Spark 通讯架构

  • Post author:
  • Post category:其他


一、Spark 通信架构概述

Spark 中通信框架的发展:

➢ Spark 早期版本中采用 Akka 作为内部通信部件。
➢ Spark1.3 中引入 Netty 通信框架,为了解决 Shuffle 的大数据传输问题使用
➢ Spark1.6 中 Akka 和 Netty 可以配置使用。Netty 完全实现了 Akka 在 Spark 中的功能。
➢ Spark2 系列中,Spark 抛弃 Akka,使用 Netty。

Spark 2.x 版本使用 Netty 通讯框架作为内部通讯组件。Spark 基于 Netty 新的 RPC 框架借鉴了 Akka 的中的设计,它是基于 Actor 模型,如下图所示:

在这里插入图片描述
Spark 通讯框架中各个组件(Client/Master/Worker)可以认为是一个个独立的实体,各个实体之间通过消息来进行通信。具体各个组件之间的关系图如下:

在这里插入图片描述
Endpoint (Client/Master/Worker) 有 1 个 InBox 和 N 个 OutBox ( N>=1,N 取决于当前 Endpoint 与多少其他的 Endpoint 进行通信,一个与其通讯的其他 Endpoint 对应一个 OutBox),Endpoint 接收到的消息被写入 InBox,发送出去的消息写入 OutBox 并被发送到其他 Endpoint 的 InBox中。

Spark 通信终端

Driver:
class DriverEndpoint extends IsolatedRpcEndpoint

Executor:
class CoarseGrainedExecutorBackend extends IsolatedRpcEndpoint

二、Spark 通讯架构解析

Spark 通信架构如下图所示:

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

  • Constructor
  • onStart
  • receive*
  • onStop

➢ RpcEnv:RPC 上下文环境,每个 RPC 终端运行时依赖的上下文环境称为 RpcEnv;在把当前 Spark 版本中使用的 NettyRpcEnv

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

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

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

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

➢ RpcAddress:表示远程的 RpcEndpointRef 的地址,Host + Port。

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

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


版权声明:本文为m0_51111980原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。