基本架构

Akka Actor式RPC架构

  1. Spark采用的是AkkaActor架构实现RPC,但是实际使用过程为了兼容不同节点之间的文件下载,采用Netty来实现Actor功能。
  2. Spark RPC由三部分组成:
  • RpcEnv RPC的执行上下文,等同于ActorSystem,用于管理RpcEndpoint和RpcEndpointRef
  • RpcEndpoint RPC通信实体的抽象,等同于Actor,用于接收客户端发送来的请求,方法主要有receive,onConnected, onDisconnnected, onStart, onStop, onError等
  • RpcEndpointRef RPC通信实体的引用,等同于ActorRef,在客户端被调用,用来向服务端请求,主要方法是ask和askWithRetry

核心组件

Dispatcher

  • InboxMessage: 外部发送过来的消息(onStart, onStop, RPCMessage, OneWayMessage...)
  • EndpointData: 包装(RpcEndpoint, NettyRpcEndpointRef, Inbox(InboxMessge队列))
  • MessageLoop: 通过线程池调度,读取阻塞队列中是否有消息,有的话就直接读取,否则阻塞
  • Inbox来源(消息来源):
  • [x] - 注册RpcEndpoint(会生成OnStart消息)
  • [x] - 去注册RpcEndpoint(会生成onStop消息)
  • [x] - postMessage, 投递消息给指定的RpcEndpoint
  • [x] - 停止Dispatcher

TransportClientFactory

RPC客户端的工厂类,用于批量生成TransportClient

  • ClientPool,ClientFactory内部通过<sokectAddress, ClientPool> 建立套接字(Socket网络连接)与ClientPool(TransportClient)的关联,同时通过object与TransportClient建立1V1的锁关联关系;即对于一个socket,会有多个TransportClient与其关联,spark通过每一个TransportClient使用不同的lock(object),来进行并行,本质还是一个利用线程池(连接缓冲池)的思想

    其类型定义为
class TransClientFactory {
ConcurrentHashMap<SocketAddress, ClientPool> connectionPool;
}
class ClientPool {
TransportClient[] clients;
Object[] locks;
}
  • TransportClient

    包含5种发送消息的方法: fetchChunk, stream, sendRPC, sendRPCSyns, send
  • TransportClientBootstrap 由TransportContext传入,启动加载(如 SAAL和加密认证之类的启动操作)

TransportContext

通过createClientFactory创建TransportClientFactory,间接通过createClient创建TransportClient; 通过createServer创建TransServer实例

  • TransportConf 配置稳健加载
  • RpcHandler,是一个abstract类,实现类为NettyRpcHandler,internalReceive负责将ByteBuffer转换成RequestMessage; postMessage用于投递消息, 然后交由对应的RPCEndpoint处理
val msgDispatch = internalReceive(client, message)
dispatcher.postMessage(msgDispatch, callback)
  • NettyStreamMessage: 提供文件服务能力

NettyRPCEnv

  • timeoutScheduler 超时请求的调度器,使用的ScheduleredExcutorService
  • clientConnectExecutor
  • outboxes: 在send()时在messages中add消息,然后调用drainOutbox()循环遍历发送messages中所有消息;drainOutbox()在没有client时会调用launchuConnectTask()创建TransportClient
private val outboxes = new ConcurrentHashMap[RpcAddress, Outbox]()
class Outbox {
nettyEnv; //所在环境
address; //远端NettyRpcEnv地址
messages; //向外发送的消息列表
client; // TransportClient
connectFuture; //连接任务的Future引用
stopped; //是否停止
draining; //Outbox正有线程处理消息
}
  • RPC客户端发送请求流程
  1. 调用NettyRpcEndpointRef的send/ask方法向RpcEndpoint发送消息;

    a) 如果是同一节点,直接使用Dispatcher的postLocalMessage和postOneWayMessage,直接将消息放入EndpointData的Inbox中;

    b) 如果发送方在远处,将消息封装成OutboxMessage,放入远端RpcEndpoint对应的Outbox的messages列表中;
  2. Outbox的drainOutbox循环从messages获取OutboxMessage,调用TransportClient向远端发送消息;
  3. 与远端的TransportServer建立连接之后,经Netty管道,NettyRpcHandler处理,投递到远端的Dispatcher的EndpointData的Inbox中进行处理

TransportServer

-TransportRequestHandler:主要是handle()方法,该方法根据request的类型,调用不同的 processXX()方法进行处理

processFetchRequest 处理获取块请求
processRPCRequest 处理RPC请求
processStreamRequest 处理Stream请求
processOneWayMessage 处理无需回复的请求

RPC服务端实现

  • TransportServer

要点总结

  1. Spark RPC是用Netty实现了数据流传输,以及Actor这种RPC框架的,其中NettyRpcEnv相当于ActorySysm, RpcEndpoint相当于Actor(远端的服务,或者说接口,注册在服务端), RpcEndpointRef相当于ActorRef(服务引用,在客户端使用),双方通信通过Message这个载体;
  2. 客户端发送消息时,通过<address, Outbox[messages, client]>这种结构,向address不断地发送消息;
  3. 服务端通过NettyRpcHandler进行消息的receive,转换成InboxMessage,放入Dispatcher中,Dispatcher使用messageLoop循环遍历Inbox,取出InboxMessage,根据消息路由,调用相应方法进行处理,即路由功能

Spark-RPC理解的更多相关文章

  1. Spark RPC框架源码分析(一)简述

    Spark RPC系列: Spark RPC框架源码分析(一)运行时序 Spark RPC框架源码分析(二)运行时序 Spark RPC框架源码分析(三)运行时序 一. Spark rpc框架概述 S ...

  2. Spark RPC框架源码分析(二)RPC运行时序

    前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...

  3. Spark RPC框架源码分析(三)Spark心跳机制分析

    一.Spark心跳概述 前面两节中介绍了Spark RPC的基本知识,以及深入剖析了Spark RPC中一些源码的实现流程. 具体可以看这里: Spark RPC框架源码分析(二)运行时序 Spark ...

  4. org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse

    跑sparkPis示例程序 [root@node01 bin]# ./spark-submit --master spark://node01:7077 --class org.apache.spar ...

  5. Spark在StandAlone模式下提交任务,spark.rpc.message.maxSize太小而出错

    1.错误信息org.apache.spark.SparkException: Job aborted due to stage failure:Serialized task 32:5 was 172 ...

  6. spark RPC详解

    前段时间看spark,看着迷迷糊糊的.最近终于有点头绪,先梳理了一下spark rpc相关的东西,先记录下来. 1,概述 个人认为,如果把分布式系统(HDFS, HBASE,SPARK等)比作一个人, ...

  7. Spark RPC

    在Spark中,对于网络调用的底层封装(粘包拆包,编解码,链路管理等)都是在common/network-common包中实现的(详见[common/network-common]).在common/ ...

  8. spark 源码分析之十二 -- Spark内置RPC机制剖析之八Spark RPC总结

    在spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv中,剖析了NettyRpcEnv的创建过程. Dispatcher.NettyStreamManager.T ...

  9. spark 源码分析之六--Spark RPC剖析之Dispatcher和Inbox、Outbox剖析

    在上篇 spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRPCEnv 中,涉及到了Diapatcher 内容,未做过多的剖析.本篇来剖析一下它的工作原理. Dispatc ...

  10. spark 源码分析之七--Spark RPC剖析之RpcEndPoint和RpcEndPointRef剖析

    RpcEndpoint 文档对RpcEndpoint的解释:An end point for the RPC that defines what functions to trigger given ...

随机推荐

  1. Linux 文件恢复

    可以恢复,使用系统自还工具debugfs来还原删除的文件 步骤详解 1. 查看一下当前系统版本号,及文件系统格式 [root@localhost ~]# df -T Filesystem Type 1 ...

  2. JAVA日常之一

    一.JDK安装及环境变量设置 下载jdk安装包,如jdk-8u65-windows-x64.exe,点击安装,记住安装路径如E:\Program Files\Java\jdk1.8.0_65: 打开环 ...

  3. npm 遇到的坑

    在脚手架方式搭建react项目时,输入命令:npm install -g create-react-app,出现错误: UNABLE_TO_VERIFY_LEAF_SIGNATUREUNABLE_TO ...

  4. conts、var 、let的区别

    1.const定义的变量不可以直接修改,通过 this.a = 'kkk' 进行修改, 而且必须初始化. 2.var定义的变量可以修改,如果不初始化会输出undefined 3.let是块级作用域,函 ...

  5. git 恢复本地误删文件

    git status git reset HEAD 路径(git status 会显示的路径) git checkout 路径

  6. 校园管家(Android开发团队项目)NABCD

    N(Need)需求: 现如今数据越来越零碎化,繁杂化,身为在校大学生的我们也因此对于时间的利用率也相应减少,为了时间的充分利用,减少在冗杂的信息中耽误的时间,充分利用大学资源,因此我们打算做一个专门发 ...

  7. VS Code引用 vue/cli

    npm i @vue/cli -g    引用cli脚手架 3.0版本 下载好后 找个空文件夹  vue create myvue 创建vue项目   myvue是自己项目名称 Your connec ...

  8. linux磁盘分区笔记

    磁盘基本概念: 硬盘结构:盘片+磁头(盘片可以有多个),工作时盘片高速运转,磁头读取数据 U盘.SSD固态硬盘是用闪存来制作的设备,没有盘片和磁头 Linux磁盘文件名: Linux所有设备都抽象为文 ...

  9. antd-vue按需加载插件babel-plugin-import报错

    报错.bezierEasingMixin().百度了一下是Less版本太高的原因,我都迷了,还有太新的过... 解决方法:将less版本降到3.0以下 因为我是用的npm生成的vue项目.所以cmd命 ...

  10. C++——list中erase和remove的区别

    1.之前在做相关的操作的时候,涉及到清除list相关的元素,因此会用到erase和remove,那么二者有什么区别呢? 从官方文档中,我们可以获取以下信息 erase : 说明:Removes fro ...