【Spark2.0源码学习】-3.Endpoint模型介绍
2017-08-23 00:03
267 查看
Spark作为分布式计算框架,多个节点的设计与相互通信模式是其重要的组成部分。
一、组件概览
对源码分析,对于设计思路理解如下:
RpcEndpoint:RPC端点 ,Spark针对于每个节点(Client/Master/Worker)都称之一个Rpc端点 ,且都实现RpcEndpoint接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果需要发送(询问)则调用Dispatcher
RpcEnv:RPC上下文环境,每个Rpc端点运行时依赖的上下文环境称之为RpcEnv
Dispatcher:消息分发器,针对于RPC端点需要发送消息或者从远程RPC接收到的消息,分发至对应的指令收件箱/发件箱。如果指令接收方是自己存入收件箱,如果指令接收方为非自身端点,则放入发件箱
Inbox:指令消息收件箱,一个本地端点对应一个收件箱,Dispatcher在每次向Inbox存入消息时,都将对应EndpointData加入内部待Receiver Queue中,另外Dispatcher创建时会启动一个单独线程进行轮询Receiver Queue,进行收件箱消息消费
OutBox:指令消息发件箱,一个远程端点对应一个发件箱,当消息放入Outbox后,紧接着将消息通过TransportClient发送出去。消息放入发件箱以及发送过程是在同一个线程中进行,这样做的主要原因是远程消息分为RpcOutboxMessage, OneWayOutboxMessage两种消息,而针对于需要应答的消息直接发送且需要得到结果进行处理
TransportClient:Netty通信客户端,根据OutBox消息的receiver信息,请求对应远程TransportServer
TransportServer:Netty通信服务端,一个RPC端点一个TransportServer,接受远程消息后调用Dispatcher分发消息至对应收发件箱
特别说明
TransportClient与TransportServer通信虚线表示两个RpcEnv之间的通信,图示没有单独表达式
一个Outbox一个TransportClient,图示没有单独表达式
一个RpcEnv中存在两个RpcEndpoint,一个代表本身启动的RPC端点,另外一个为 RpcEndpointVerifier
二、Endpoint启动过程
启动的流程如下:
Endpoint启动过程基本上与组件概览中组件能很好的对应
Endpoint启动后,默认会向Inbox中添加OnStart消息,不同的端点(Master/Worker/Client)消费OnStart指令时,进行相关端点的启动额外处理
Endpoint启动时,会默认启动TransportServer,且启动结束后会进行一次同步测试rpc可用性(askSync-BoundPortsRequest)
Dispatcher作为一个分发器,内部存放了Inbox,Outbox的等相关句柄和存放了相关处理状态数据,结构大致如下
三、Endpoint Send&Ask流程
Endpoint的消息发送与请求流程,如下:
Endpoint根据业务需要存入两个维度的消息组合:send/ask某个消息,receiver是自身与非自身
OneWayMessage: send + 自身, 直接存入收件箱
OneWayOutboxMessage:send + 非自身,存入发件箱并直接发送
RpcMessage: ask + 自身, 直接存入收件箱,另外还需要存入LocalNettyRpcCallContext,需要回调后再返回
RpcOutboxMessage: ask + 非自身,存入发件箱并直接发送,,需要回调后再返回
四、Endpoint receive流程
Endpoint的消息的接收,流程如下:
上图 ServerBootstrap为Netty启动服务,SocketChanel为Netty数据通道
上述包含TransportSever启动与消息接受两个流程
五、Endpoint Inbox处理流程
Spark在Endpoint的设计上核心设计即为Inbox与Outbox,其中Inbox核心要点为
内部的处理流程拆分为多个消息指令(InboxMessage)存放入Inbox
当Dispatcher启动最后,会启动一个名为【dispatcher-event-loop】的线程扫描Inbox待处理InboxMessage,并调用Endpoint根据InboxMessage类型做相应处理
当Dispatcher启动最后,默认会向Inbox存入OnStart类型的InboxMessage,Endpoint在根据OnStart指令做相关的额外启动工作,三端启动后所有的工作都是对OnStart指令处理衍生出来的,因此可以说OnStart指令是相互通信的源头
消息指令类型大致如下三类
OnStart/OnStop
RpcMessage/OneWayMessage
RemoteProcessDisconnected/RemoteProcessConnected/RemoteProcessConnectionError
六,Endpoint画像
该图理解 Endpoint的结构使用,不再赘述。
一、组件概览
对源码分析,对于设计思路理解如下:
RpcEndpoint:RPC端点 ,Spark针对于每个节点(Client/Master/Worker)都称之一个Rpc端点 ,且都实现RpcEndpoint接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果需要发送(询问)则调用Dispatcher
RpcEnv:RPC上下文环境,每个Rpc端点运行时依赖的上下文环境称之为RpcEnv
Dispatcher:消息分发器,针对于RPC端点需要发送消息或者从远程RPC接收到的消息,分发至对应的指令收件箱/发件箱。如果指令接收方是自己存入收件箱,如果指令接收方为非自身端点,则放入发件箱
Inbox:指令消息收件箱,一个本地端点对应一个收件箱,Dispatcher在每次向Inbox存入消息时,都将对应EndpointData加入内部待Receiver Queue中,另外Dispatcher创建时会启动一个单独线程进行轮询Receiver Queue,进行收件箱消息消费
OutBox:指令消息发件箱,一个远程端点对应一个发件箱,当消息放入Outbox后,紧接着将消息通过TransportClient发送出去。消息放入发件箱以及发送过程是在同一个线程中进行,这样做的主要原因是远程消息分为RpcOutboxMessage, OneWayOutboxMessage两种消息,而针对于需要应答的消息直接发送且需要得到结果进行处理
TransportClient:Netty通信客户端,根据OutBox消息的receiver信息,请求对应远程TransportServer
TransportServer:Netty通信服务端,一个RPC端点一个TransportServer,接受远程消息后调用Dispatcher分发消息至对应收发件箱
特别说明
TransportClient与TransportServer通信虚线表示两个RpcEnv之间的通信,图示没有单独表达式
一个Outbox一个TransportClient,图示没有单独表达式
一个RpcEnv中存在两个RpcEndpoint,一个代表本身启动的RPC端点,另外一个为 RpcEndpointVerifier
二、Endpoint启动过程
启动的流程如下:
Endpoint启动过程基本上与组件概览中组件能很好的对应
Endpoint启动后,默认会向Inbox中添加OnStart消息,不同的端点(Master/Worker/Client)消费OnStart指令时,进行相关端点的启动额外处理
Endpoint启动时,会默认启动TransportServer,且启动结束后会进行一次同步测试rpc可用性(askSync-BoundPortsRequest)
Dispatcher作为一个分发器,内部存放了Inbox,Outbox的等相关句柄和存放了相关处理状态数据,结构大致如下
三、Endpoint Send&Ask流程
Endpoint的消息发送与请求流程,如下:
Endpoint根据业务需要存入两个维度的消息组合:send/ask某个消息,receiver是自身与非自身
OneWayMessage: send + 自身, 直接存入收件箱
OneWayOutboxMessage:send + 非自身,存入发件箱并直接发送
RpcMessage: ask + 自身, 直接存入收件箱,另外还需要存入LocalNettyRpcCallContext,需要回调后再返回
RpcOutboxMessage: ask + 非自身,存入发件箱并直接发送,,需要回调后再返回
四、Endpoint receive流程
Endpoint的消息的接收,流程如下:
上图 ServerBootstrap为Netty启动服务,SocketChanel为Netty数据通道
上述包含TransportSever启动与消息接受两个流程
五、Endpoint Inbox处理流程
Spark在Endpoint的设计上核心设计即为Inbox与Outbox,其中Inbox核心要点为
内部的处理流程拆分为多个消息指令(InboxMessage)存放入Inbox
当Dispatcher启动最后,会启动一个名为【dispatcher-event-loop】的线程扫描Inbox待处理InboxMessage,并调用Endpoint根据InboxMessage类型做相应处理
当Dispatcher启动最后,默认会向Inbox存入OnStart类型的InboxMessage,Endpoint在根据OnStart指令做相关的额外启动工作,三端启动后所有的工作都是对OnStart指令处理衍生出来的,因此可以说OnStart指令是相互通信的源头
消息指令类型大致如下三类
OnStart/OnStop
RpcMessage/OneWayMessage
RemoteProcessDisconnected/RemoteProcessConnected/RemoteProcessConnectionError
六,Endpoint画像
该图理解 Endpoint的结构使用,不再赘述。
相关文章推荐
- 【Spark2.0源码学习】-3.Endpoint模型介绍
- 【Spark2.0源码学习】-8.SparkContext与Application介绍
- 【Spark2.0源码学习】-8.SparkContext与Application介绍
- 【Spark2.0源码学习】-6.Client启动
- 【Spark2.0源码学习】-4.Master启动
- 【Spark2.0源码学习】-5.Worker启动
- spark学习-73-源代码:Endpoint模型介绍(5)-Netty通讯小例子
- spark学习-74-源代码:Endpoint模型介绍(6)-Endpoint的消息的接收
- Spark入门到精通视频学习资料--第二章:Spark生态系统介绍,Spark整体概述与Spark编程模型(2讲)
- 【Spark2.0源码学习】-5.Worker启动
- 【Spark2.0源码学习】-7.Driver与DriverRunner
- 【Spark2.0源码学习】-6.Client启动
- 【Spark2.0源码学习】-7.Driver与DriverRunner
- 【Spark2.0源码学习】-9.Job提交与Task的拆分
- spark学习-71-源代码:Endpoint模型介绍(3)-Endpoint Send&Ask流程
- 【Spark2.0源码学习】-10.Task执行与回馈
- spark学习-70-源代码:Endpoint模型介绍(2)-启动流程
- 【Spark2.0源码学习】-4.Master启动
- 【Spark2.0源码学习】-9.Job提交与Task的拆分
- 【Spark2.0源码学习】-1.概述