Spark通信架构(转载)

声明:该博客整理自尚硅谷2018出的一套教学视频,Spark章节由武玉飞老师主讲,非本人原创。

目录

一、概述

二、通信组件概览

三、 EndPoint启动流程

四、EndPoint Send&Ask流程

五、EndPoint receive 流程

六、EndPoint Inbox处理流程

七、EndPoint画像


一、概述

Spark作为分布式计算框架,多个节点的设计与相互通信模式是其重要的组成部分。

Spark一开始使用Akka作为其内部通信组件。在Spark1.3年代,为了解决大数据块(如shuffle)的传输问题,Spark引入了Netty通信框架。到了Spark1.6,Spark可以配置使用Akka或者Netty了,这意味着Netty可以完全替代Akka了。再到Spark2,Spark已经完全抛弃 Akka,全部使用Netty了。

官方给出的原因有下:

  1. 很多Spark用户自己也使用Akka,但是由于 Akka 不同版本之间无法互相通信,这就要求用户必须使用跟Spark完全相同的 Akka版本,导致用户无法升级 Akka
  2. Spark用的 Akka 配置是针对Spark自身来调优的,可能跟用户自己代码中的 Akka 配置冲突
  3. Spark 用的Akka 特性很少,这部分特性很容易自己实现,同时,这部分代码量相比 Akka 来说少很多,debug比较容易。如果遇到什么bug,也可以自己马上fix,不需要等到 Akka 上游发布新版本。而且,Spark 升级Akka 本身由因为第一点会强制要求用户升级他们使用的Akka,对某些用户来说是不现实的。

二、通信组件概览

经分析源码,对Spark的设计思路理解如下:

  1. RpcEndPoint: RPC端点,Spark针对每个节点(Client/Master/Worker)都称之为一个Rpc端点,且都实现了RpcEndPoint接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果要发送(询问)则调用Dispatcher。
  2. RpcEnv:RPC的上下文 环境,每个Rpc端点运行时依赖的上下文环境称之为RpcEnv
  3. Dispatcher:消息分发器,针对于RPC端点,需要发送消息或从远程RPC接收到的消息,分发至对应的指令收件箱/发件箱。如果指令接收方是自己,则存入收件箱,如果指令接收方为非自身端点,则放入发件箱。
  4. InBox:指令消息收件箱。一个本地端点对应一个收件箱,Dispatcher在每次向Inbox存入消息时,都将对应EndPointData加入内部的ReceiverQueue中,另外,Dispatcher创建时 会启动一个单独线程进行轮询ReceiverQueue,进行收件箱消息消费。
  5. OutBox:指令消息发件箱,一个远程端点对应一个发件箱(也就是说一个本地端点可以有多个发件箱),当消息放入Outbox后,紧接着将消息通过TransportClient发送出去。消息放入发件箱以及发送过程是在同一个线程中进行,这样做的主要原因是远程消息分为RpcOutboxMessage,OneWayOutboxMessage两种消息,而针对于需要应答的消息直接发送且需要得到结果进行处理。
  6. TranSportClient:Netty通信客户端,一个OutBox对应一个TranSportClient,根据OutBox消息的receiver信息,请求对应远程TranSportServer。
  7. TranSportServer:Netty通信服务端,一个Rpc端点对应一个TranSportServer,接远程消息后调用Dispatcher分发消息至对应的收发件箱。

三、 EndPoint启动流程

EndPoint启动后,默认会向Inbox中添加 Onstart消息,不同的端点(Master/Worker/Client)消费Onstart指令时,进行相关端点的启动处理流程(会在具体的实现类中实现)。

EndPoint启动时,会默认启动TranSportServer,且启动结束后悔进行一次同步测试rpc可用性(askSync-BoundPortsRequest)。

Dispatcher作为一个分发器,内部存放了InBox句柄和状态数据(outBoxes在NettyRpcEnv中)。结构大致如下:

四、EndPoint Send&Ask流程

EndPoint的消息发送与请求流程如下:

EndPoint根据业务需要存入两个维度的消息组合:send/ask 某个消息,receiver是自身与非自身

  1. OneWayMessage: send + 自身,直接存入收件箱
  2. OneWayOutboxMessage: send + 非自身,存入发件箱并直接发送
  3. RpcMessage: ask + 自身,直接存入收件箱,另外还需要存入LocalNettyRpcCallContext需要回调后再返回。
  4. RpcOutMessage: ask + 非自身,存入发件箱并直接发送,需要回调或再返回。

五、EndPoint receive 流程

EndPoint的消息的接收,流程如下:

上图ServerBootstrap为Netty启动服务,SocketChannel为Netty数据通道

上述包含 TranSportServer启动与消息接收两个流程

六、EndPoint Inbox处理流程

Spark在EndPoint的设计上核心设计即为Inbox与OutBox,其中Inbox核心要点为:

  1. 内部的处理流程拆分为多个消息指令(InboxMessage)村放入Inbox
  2. Dispatcher启动最后,会启动一个名为"dispatcher-event-loop"的线程扫描Inbox待处理InboxMessage,并调用EndPoint根据InboxMessage类型做相应处理。
  3. Dispatcher启动最后,会默认向Inbox存Onstart类型的InboxMessage,EndPoint在根据Onstart指令做相关的额外启动工作,三端启动后所有的工作都是对Onstart指令处理衍生出来的,因此可以说Onstart指令时相互通信的源头。

指令类型大致如下三类:

  1. Onstart/Onstop
  2. RpcMessage/OneWayMessage
  3. RemoteProcessDisconnected/RemoteProcessConnected/RemoteProcessConnectionError

七、EndPoint画像

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值