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. php与mysql之间操作原理

    php和mysql相关扩展有:mysql.mysqli和pdo三种 mysql扩展从php5.5.0被废弃,并且从从php7.0.0开始被废除 mysql之前的使用---几个基本的函数:mysql_c ...

  2. hdoj1421(bfs)

    bfs 练习题,简单bfs 题意:给一块地图,找出油田的块的数量,这里要考虑油田的八个方向,上下左右(左右)上(左右)下,存在则可以并在一起.@是油田,*是土地,m是行,n是列. 解题思路:用一个二维 ...

  3. jQuery(20161108)

    jQuery的引入包必须要在其他引入包的最上方,否则会出错.因为如果在页面加载完成后还未执行jQuery包,那么jQuery的引入包就没用了 如果浏览器报错:Uncaught Error: Boots ...

  4. 快速上手UIBezierPath

    UIBezierPath主要用来绘制矢量图形,它是基于Core Graphics对CGPathRef数据类型和path绘图属性的一个封装,所以是需要图形上下文的(CGContextRef),所以一般U ...

  5. 解决input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能

    最近做项目遇到: 背景:点击单元格,easyUI自动生成input可编辑框. 问题点:input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能 要实现需求: 1.回车键 ...

  6. PHP语言开发微信公众平台(订阅号)之curl命令

    在开发过程中,经常会遇到要求用curl命令调用接口的情况 那么,什么是curl,简单来说curl是一个利用url语法规定来传输文件和哦数据的工具,支持很多协议,如 http.ftp.telent 等, ...

  7. PHP之流程的控制

       在一个公司中,员工肯定会有高层.中层和普通员工的,这样如果在某个公司员工遇到某种问题,需要请假.或者提一些请求的时候,就会需要去申请,申请的时候有的是可以直接和上级申请的,有时比较重要的事情,是 ...

  8. eclipse 中 Servlet 模板代码(其实是代码提示模板)

    说的是模板代码,应该说的是提示的模板代码,并不是一新建就会出现模板. 第一步:先建一个Servlet文件,写好自己想要的模板 我的模板如下: 全选并复制,等会要粘贴到Servlet的提示模板中. pa ...

  9. Java字节流在Android中的使用

    引言:项目开发有时会使用上传文件到服务器,再从服务器取数据显示到本地这一过程:或者输入一段文字,再把文字显示出来.这个过程都用到了IO流. IO流分为字符流(Reader\Writer)和字节流(In ...

  10. webService常见问题

    1.普通字符串(日期形式)转换为XMLGregorianCalendar SimpleDateFormat simpleDateFormat =new SimpleDateFormat("y ...