Spark作为分布式计算框架,多个节点的设计与相互通信模式是其重要的组成部分。
 
一、组件概览
     对源码分析,对于设计思路理解如下:
          
  • RpcEndpoint:RPC端点 ,Spark针对于每个节点(Client/Master/Worker)都称之一个Rpc端点 ,且都实现RpcEndpoint接口,内部根据不同端点的需求设计不同的消息和不同的业务处理,如果需要发送/询问则调用Dispacher
  • RpcEnv:RPC上下文环境,每个Rpc端点运行时依赖的上下文环境称之为RpcEnv
  • Dispacker:消息分发器,针对于RPC端点需要发送或者远程RPC介绍到的消息分发至对应的指令收件箱/发件箱,如果指令接收方是自己存入收件箱,如果指令接收方为非自身端点,则放入发件箱
  • Inbox:指令消息收件箱,一个本地端点对应一个收件箱,Dispacher在每次向Inbox存入消息时都会将对应EndpointData加入内部待Receiver Queue中,另外Dispacher创建时会启动一个单独线程进行轮询Receiver Queue,进行收件箱消息消费
  • OutBox:指令消息发件箱,一个远程端点对应一个发件箱,当消息放入Outbox后,紧接着将消息通过TransportClient发送出去,在同一个线程中进行,原因为远程消息分为RpcOutboxMessage, OneWayOutboxMessage两种消息,而针对于需要应答的消息直接发送更加合适
  • TransportClient:Netty通信客户端,根据outbox的消息的receiver请求对应远程TransportServer,
  • TransportServer:Netty通信服务端,一个RPC端点一个TransportServer,接受远程消息后调用Dispacher分发消息至对应收发件箱
  • 特别说明
    • TransportClient与TransportServer通信虚线表示两个RpcEnv之间的通信,图示没有单独表达式
    • 一个Outbox一个TransportClient,图示没有单独表达式
    • 一个RpcEnv中存在两个RpcEndpoint,一个代表本身启动的RPC端点,另外一个为 RpcEndpointVerifier
 
二、Endpoint启动过程
     启动的流程如下:
  
  • Endpoint启动过程基本上与组件概览中组件能很好的对应
  • Endpoint启动后,默认会向Inbox中添加OnStart消息,不同的端点(Master/Worker/Client)消费OnStart指令时,进行相关端点的启动额外处理
  • Endpoint启动时,会默认启动TransportServer,且启动借宿后会进行一次同步测试rpc可用性(askSync-BoundPortsRequest)
  • Dispacher作为一个分发器,内部存放了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
  • 当Dispacher启动最后,会启动一个名为【dispatcher-event-loop】的线程扫描Inbox待处理InboxMessage,并调用Endpoint根据InboxMessage类型做相应处理
  • 当Dispacher启动最后,默认会向Inbox存入OnStart类型的InboxMessage,Endpoint在根据OnStart指令做相关的额外启动工作,三端启动后所有的工作都是对OnStart指令处理衍生出来的,因此可以说OnStart指令是相互通信的源头
          消息指令类型大致如下三类
  • OnStart/OnStop
  • RpcMessage/OneWayMessage
  • RemoteProcessDisconnected/RemoteProcessConnected/RemoteProcessConnectionError
 
六,Endpoint画像
 
     该图理解 Endpoint的结构使用,不再赘述。

【Spark2.0源码学习】-3.Endpoint模型介绍的更多相关文章

  1. 【Spark2.0源码学习】-1.概述

          Spark作为当前主流的分布式计算框架,其高效性.通用性.易用性使其得到广泛的关注,本系列博客不会介绍其原理.安装与使用相关知识,将会从源码角度进行深度分析,理解其背后的设计精髓,以便后续 ...

  2. spark2.0源码学习

    [Spark2.0源码学习]-1.概述 [Spark2.0源码学习]-2.一切从脚本说起 [Spark2.0源码学习]-3.Endpoint模型介绍 [Spark2.0源码学习]-4.Master启动 ...

  3. 【Spark2.0源码学习】-2.一切从脚本说起

    从脚本说起      在看源码之前,我们一般会看相关脚本了解其初始化信息以及Bootstrap类,Spark也不例外,而Spark我们启动三端使用的脚本如下: %SPARK_HOME%/sbin/st ...

  4. 【Spark2.0源码学习】-6.Client启动

    Client作为Endpoint的具体实例,下面我们介绍一下Client启动以及OnStart指令后的额外工作 一.脚本概览      下面是一个举例: /opt/jdk1..0_79/bin/jav ...

  5. 【Spark2.0源码学习】-4.Master启动

         Master作为Endpoint的具体实例,下面我们介绍一下Master启动以及OnStart指令后的相关工作   一.脚本概览      下面是一个举例: /opt/jdk1..0_79/ ...

  6. 【Spark2.0源码学习】-5.Worker启动

         Worker作为Endpoint的具体实例,下面我们介绍一下Worker启动以及OnStart指令后的额外工作   一.脚本概览      下面是一个举例: /opt/jdk1..0_79/ ...

  7. 【Spark2.0源码学习】-8.SparkContext与Application介绍

             在前面的内容,我们针对于RpcEndpoint启动以及RpcEndpoint消息处理机制进行了详细的介绍,在我们的大脑里,基本上可以构建Spark各节点的模样.接下来的章节将会从Sp ...

  8. 【Spark2.0源码学习】-9.Job提交与Task的拆分

          在前面的章节Client的加载中,Spark的DriverRunner已开始执行用户任务类(比如:org.apache.spark.examples.SparkPi),下面我们开始针对于用 ...

  9. 【Spark2.0源码学习】-10.Task执行与回馈

         通过上一节内容,DriverEndpoint最终生成多个可执行的TaskDescription对象,并向各个ExecutorEndpoint发送LaunchTask指令,本节内容将关注Exe ...

随机推荐

  1. C#:查询某年(1900-2100)某月的日历

    using System;using System.Collections.Generic;public class Program    {     /********************主函数 ...

  2. node插件http-proxy实现反向代理

    最近自己动手做了一个微信小程序,是直接买的腾讯云的小程序解决方案,怎么说那,用起来还是会遇到不少问题的,不过在交流群里还是会有很多人帮助你的. 闲话少说,因为要再做一个别的服务,就想直接用这台小程序的 ...

  3. 容斥原理及SQL in关键字在EF中的应用

    突然意识到文字的重要性,于是开始写了第一个篇博客,博客目的紧紧为记录,以便温故. 同时也希望抛砖能达到引玉的作用,欢迎各位来发表自己的感想与想法,以此达到相互学习促进! 背景: 在做百度地图电子围栏的 ...

  4. yii2 Nav::widget() 和 Menu::widget()

    Nav::widget http://www.yiiframework.com/doc-2.0/yii-bootstrap-nav.html Menu::widget()  http://www.yi ...

  5. c# 将匿名类或者集合转Json格式数据一些方法

    要说写这个功能呢也是因为工作需要,白天呢上班写个Web页面需要ajax请求后台并将数据以Json格式传会前端,由于公司特殊性吧,不能连外网(很苦比).所以只有等到晚上回家上网边查边写! public ...

  6. Cordova框架基本原理

    最近在做混编项目,也是从项目里开始接触Cordova框架,网上很多帖子都总结的很好,我还是要总结一下,便于加深一下. Cordova框架是一个可以让JS与原生代码(包括 Android 的 java, ...

  7. DBMS

    数据库中的概念 Catalog(分类) Table(表) Column(列)或者Field(字段) Primary(主键):唯一标识数据行的一列 业务主键:有业务意义的字段做主键 逻辑主键:使用没有任 ...

  8. 关于<context:property-placeholder>的一个有趣现象

    转:http://stamen.iteye.com/blog/1926166 先来看下A和B两个模块 A模块和B模块都分别拥有自己的Spring XML配置,并分别拥有自己的配置文件: A模块 A模块 ...

  9. web简易MP3播放插件 Aplayer篇章一

    效果如图所示: 写入初始代码,定义一个id唯一的div player1 <!DOCTYPE html> <html> <head> <meta charset ...

  10. SQL AlawaysOn 之一:安装域控制器

    一.准备阶段 1.  计算机名称命名 2.IP地址修改.DNS修改 IP地址和DNS不一定要和图上的一致,只要固定就行了 二.安装阶段 1.服务器管理器,仪表盘,点击“添加角色和功能” 2.添加角色和 ...