Spark源码之组件间通信(Driver <==> Executor)

18 篇文章 0 订阅

Spark源码之组件间通信(Driver <==> Executor)

我们了解使用socket通信,一个server,一个client,一个发信息,一个收信息。但是对于分布式的框架,这种阻塞方式的通信明显不能符合使用要求。Spark的通信使用的是异步非阻塞通信,引入了Netty通信框架,将Netty作为内部的通信组件,设计了基于Netty的RPC通信框架。

一、简单介绍

因为Linux对AIO的支持并不好,所以Linux采用了Epoll的方式模拟了AIO通信

BIO:阻塞式IO
NIO:非阻塞式IO
AIO:异步非阻塞式IO

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

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

二、相关概念

RpcEndpoint:RPC 通信终端。Spark 针对每个节点(Client/Master/Worker)都称之为一 个 RPC 终端,且都实现 RpcEndpoint 接口,内部根据不同端点的需求,设计不同的消 息和不同的业务处理,如果需要发送(询问)则调用 Dispatcher。

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 分发消息至对应收发件箱;

三、执行流程

在这里插入图片描述

详细结构图
在这里插入图片描述

四、总结

Driver通过DriverEndpoint类进行通信,Executor通过CoarseGrainedExecutorBackend进行通信,通信的时候借助RpcEndPoint(Rpc终端)里的inbox接收信息,通过RpcEndpointRef(RPC终端引用)里的outbox发生信息,outbox可以有多个,取决于与其通讯的Endpoint个数

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧码文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值