Spark源码解析(一)Spark RPC分析

Spark核心 源码解析 文章目录核心1.Spark应用提交2.Spark内部组件及通信源码解析SparkSubmitApplicationMasterCoarseGrainedExecutorBackend通信3.Spark作业的提交(调度)4.任务的执行Shuffle 核心 所谓的内核,其实就是Spark的内部核心原理。 1.Spark应用提交 (1) Spark向Yarn提交 (1) Spark向Yarn提交 当使用bin/java执行java程序时,会产生JVM,java的进程 (2) ApplicationMast 阅读详情

通过学习Spark源码为了更深入的了解Spark。主要按照以下流程进行Spark的源码分析,包含了Spark集群的启动以及任务提交的执行流程:

  1. Spark RPC分析
  2. start-all.sh
  3. Master启动分析
  4. Work启动分析
  5. spark-submit.sh脚本分析
  6. SparkSubmit分析
  7. SparkContext初始化

1.Spark RPC分析

1.1.概述

了解Spark分布式集群的执行流程,那就不得不从Spark的网络通信说起,例如:

  • driver和master的通信,比如driver会想master发送RegisterApplication消息
  • master和worker的通信,比如worker会向master上报worker上运行Executor信息
  • executor和driver的的通信,executor运行在worker上,spark的tasks被分发到运行在各个
  • executor中,executor需要通过向driver发送任务运行结果。
  • worker和worker的通信,task运行期间需要从其他地方fetch数据,这些数据是由运行在其他worker上的executor上的task产生,因此需要到worker上fetch数据

总的说来,Spark通信主要存在于两个方面:

  1. 汇集信息,例如task变化信息,executor状态变化信息。
  2.  传输数据,spark shuffle(也就是reduce从上游map的输出中汇集输入数据)阶段存在大量的数据传输。

Spark通信框架版本更迭:

Spark 1.6之前,Spark 的 RPC 是基于 Akaa 来实现的。Akka 是一个基于 scala 语言的异步的消息框架。Spark1.6 后,Spark 借鉴 Akka 的设计自己实现了一个基于 Netty 的 rpc 框架。大概的原因是 1.6之前,RPC 通过 Akka 来实现,而大文件是基于 netty 来实现的,加之akka 版本兼容性问题,所以 1.6之后把 Akka 改掉了。

Spark早期版本中使用Netty通信框架做数据的传输,使用Akka用作RPC通信。

Spark 官网文档对此的描述为:“Akka 的依赖被移除了,因此用户可以使用任何版本的 Akka 来编程了。”Spark 团队的决策者或许认为对于 Akka 具体版本的依赖,限制了用户对于 Akka 不同版本的使用。

1.2.Spark的RPC组成

spark 基于netty新的rpc框架借鉴了Akka的中的设计,它是基于Actor模型,各个组件可以认为是一个个独立的实体,各个实体之间通过消息来进行通信。

  1. RpcEndPonit 和 RpcCallContext
    1. RpcEndPoint 是一个可以相应请求的服务,类似于 Akka 中的 Actor。表示一个个需要通信的个体(如master,worker,driver),主要根据接收的消息来进行对应的处理。一个RpcEndpoint经历的过程依次是:构建 -> onStart -> receive -> onStop。其中onStart在接收任务消息前调用,receive和receiveAndReply分别用来接收另一个RpcEndpoint(也可以是本身)send和ask过来的消息。
  2. RpcEndpointRef
    1. 类似于 Akka 中的 ActorRef,是 RpcEndPoint 的引用,持有远程 RpcEndPoint 的地址名称等,提供了 send 方法和 ask 方法用于发送请求。RpcEndpointRef 是对远程 RpcEndpoint 的一个引用。当我们需要向一个具体的 RpcEndpoint 发送消息时,一般我们需要获取到该 RpcEndpoint 的引用,然后通过该引用发送消息。
  3. RpcEnv 和 NettyRpcEnv
    1. RpcEnv 类似于 ActorSystem,服务端和客户端都可以使用它来做通信。
    2. 对于 server 端来说,RpcEnv 是 RpcEndpoint 的运行环境,负责 RpcEndPoint 的生命周期管理,解析 Tcp 层的数据包以及反序列化数据封装成 RpcMessage,然后根据路由传送到对应的 Endpoint;
    3. 对于 client 端来说,可以通过 RpcEnv 获取 RpcEndpoint 的引用,也就是 RpcEndpointRef,然后通过 RpcEndpointRef 与对应的 Endpoint 通信。
    4. RpcEnv 为 RpcEndpoint 提供处理消息的环境。RpcEnv 负责 RpcEndpoint 整个生命周期的管理,包括:注册endpoint,endpoint 之间消息的路由,以及停止 endpoint。
  4. Dispacher 与 Inbox 与 Outbox
    1. NettyRpcEnv 中包含 Dispatcher,主要针对服务端,帮助路由到指定的 RpcEndPoint,并调用起业务逻辑。
    2. RpcEndpoint:RPC端点 ,Spark针对于每个节点(Client/Master/Worker)都称之一个Rpc端点 ,且都实现RpcEndpoint接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果需要发送(询问)则调用Dispatcher
    3. Dispatcher:消息分发器,针对于RPC端点需要发送消息或者从远程RPC接收到的消息,分发至对应的指令收件箱/发件箱。如果指令接收方是自己存入收件箱,如果指令接收方为非自身端点,则放入发件箱
    4. Inbox:指令消息收件箱,一个本地端点对应一个收件箱,Dispatcher在每次向Inbox存入消息时,都将对应EndpointData加入内部待Receiver Queue中,另外Dispatcher创建时会启动一个单独线程进行轮询Receiver Queue,进行收件箱消息消费
    5. OutBox:指令消息发件箱,一个远程端点对应一个发件箱,当消息放入Outbox后,紧接着将消息通过TransportClient发送出去。消息放入发件箱以及发送过程是在同一个线程中进行,这样做的主要原因是远程消息分为RpcOutboxMessage, OneWayOutboxMessage两种消息,而针对于需要应答的消息直接发送且需要得到结果进行处理
    6. TransportClient:Netty通信客户端,根据OutBox消息的receiver信息,请求对应远程TransportServer
    7. TransportServer:Netty通信服务端,一个RPC端点一个TransportServer,接受远程消息后调用Dispatcher分发消息至对应收发件箱

核心要点如下:

  1. 核心的 RpcEnv 是一个特质(trait),它主要提供了停止,注册,获取 endpoint 等方法的定义,而NettyRpcEnv 提供了该特质的一个具体实现。
  2. 通过工厂 RpcEnvFactory 来产生一个 RpcEnv,而 NettyRpcEnvFactory 用来生成 NettyRpcEnv 的一个对象。
  3. 当我们调用 RpcEnv 中的 setupEndpoint 来注册一个 endpoint 到 rpcEnv 的时候,在NettyRpcEnv 内部,会将该 endpoint 的名称与其本省的映射关系,rpcEndpoint 与 rpcEndpointRef之间映射关系保存在 dispatcher 对应的成员变量中。

spark2.1.0之源码分析——服务端RPC处理器RpcHandler详解   提示:阅读本文前最好先阅读: 《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》 《spark2.1.0之源码分析——RPC管道初始化》... 阅读详情

相关推荐

spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory

提示:阅读本文前最好先阅读《Spark2.1.0之内置RPC框架》和《spark2.1.0之源码分析——RPC配置TransportConf》。      TransportClientFactory是创建传输客户端(TransportClient)的工厂类。在说明《Spark2.1.0之内置RPC框架》文中的图1中的记号①时提到过TransportContext的createClientFact...

beliefer的博客 2553

Spark源码解读(一)

一、spark通过yarn启动的过程 在spark通过yarn提交的时候,会去执行SparkSubmit的main方法。 override def main(args: Array[String]): Unit = { val submit = new SparkSubmit() { self => override protected def parseArguments(args: Array[String]): SparkSubmitArguments =

一个有深度的博客 1582

spark 2.4.0源码分析--(三)Spark Netty通信传输层架构

文章目录一、TansportSever服务度 一、TansportSever服务度 留名,本周加上后续内容

LS_ice的专栏 2231

spark 源码分析

spark 一、 启动篇 (一) 引子 在spark-shell终端执行 val arr=Array(1,2,3,4)val rdd=sc.makeRDD(arr) rdd.collect 以上3行代码构成了一个完整的spark job执行。 (二) 启动篇 shell模式shell模式下启动入口:org.apache.spark.repl. Main submit模式 ...

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 511

语义分割系列7-Attention Unet(pytorch实现)

本文介绍了AttentionUnet模型和其主要中心思想,并在pytorch框架上构建了Attention Unet模型,构建了Attention gate模块,在数据集Camvid上进行复现。

yumaomi的博客 2万+

手把手教你用CV5200模块搭建无人机高清图传系统(含实测数据)

本文提供了一份基于CV5200模块搭建远距离无人机高清图传系统的完整实战指南。文章详细解析了系统架构、硬件连接、软件配置与优化,并分享了实地飞行测试数据。核心在于利用CV5200的LR-WiFi私有协议,在视距下实现数公里级的稳定高清视频传输,为DIY爱好者和行业应用提供了高性价比的解决方案。

day7的博客 720

2万字硬核spark源码精讲手册

spark源码精讲,结合企业级开发和面试实战重点关注内容

5092

Ubuntu 20.04 上 Geant4 安装避坑全记录:从源码编译到 B1 示例跑通(含数据包加速下载)

本文详细记录了在Ubuntu 20.04系统上从源码编译安装Geant4的全过程,包括环境准备、依赖安装、CMake参数解析、多线程编译优化以及数据包加速下载等关键步骤。特别针对B1示例的测试与验证提供了完整流程,帮助科研人员和学生避开常见安装陷阱,提升粒子物理模拟效率。

weixin_31220401的博客 312

Spark重要源码解读

SparkConf类 /** *Configuration for a Spark application. Used to set various Spark parameters as key-value pairs. * *Most of the time, you would create a SparkConf object with new SparkConf(), which wil...

Winyar的博客 373

Zotero on Mac: 高效文献管理与引用指南

本文为Mac用户提供了一份全面的Zotero高效文献管理与引用指南。从安装配置、文献收集管理、PDF深度阅读与笔记,到在Word中无缝插入引用和生成参考文献,详细讲解了核心工作流。同时推荐了ZotFile、Better BibTeX等必备插件,并介绍了利用同步与WebDAV实现跨设备无缝衔接的方法,助力研究者构建个人数字知识库,极大提升学术研究效率。

weixin_29281941的博客 1177

Windows NPS与华为、华三、思科设备RADIUS认证实战指南

本文详细介绍了Windows NPS与华为、华三、思科设备RADIUS认证的实战配置指南。通过NPS服务器统一管理网络设备认证,实现企业级安全访问控制,涵盖基础配置、设备对接及故障排查方法,助力管理员提升网络安全管理效率。

weixin_29284201的博客 505

Spark源码分析之Rpc框架

文章目录概述基本概念组件原理Message消息通信架构SparkEnv的初始化 概述 在Spark中很多地方都涉及网络通信,比如 Spark各个组件间的消息互通、用户文件与Jar包的上传、节点间的Shuffle过程、Block数据的复制与备份等。Spark1.6之前,Spark的Rpc是基于Akka来实现的,Akka是一个基于scala语言的异步的消息框架,但由于Akka不适合大文件的传输,在Sp...

Haiwi-Song 1185

基于生存结局(生存分析/COX回归)的中介效应分析

① 建立观察变量OVB和中介变量MVB的回归模型(注意:这里根据mediation包的介绍,需要构建的是probit模型,而不是logist回归模型,网上有很多的代码用的logistic回归,结果自己跑的时候发现报错,我在这里陷了很久;为了方便演示,我们生成了一个协变量(Age)、一个连续型观察变量(liaOVC)、一个二分类观察变量(OVB)、一个连续型中介变量(MVC)、一个二分类中介变量(MVB)以及最后的结局变量(生存时间[time],生存结局[stats])。

m0_61863309的博客 1万+

【Spark 源码】1-Spark RPC

Spark 的 RPC 概述 Spark 是一个 通用的分布式计算系统,既然是分布式的,必然存在很多节点之间的通信,那么 Spark不同组件之间就会通过 RPC(Remote Procedure Call)进行点对点通信。以下所有都是基于spark2.4.X版本进行分析学习的,该版本也是当前CDH 稳定版本 spark中网络通信无处不在,例如 -driver和master的通信,比如driver会向master发送RegisterApplication消息 ...

zhangxiaohui4445的博客 1984

(5)ModalAI VOXL2

Ardupilot官网关于《Non-GPS navigation》的翻译 —《(5) ModalAI VOXL2》。

无人机开发(开源Ardupilot) 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

spark源码-RPC通信机制

spark源码

m0_37817767的博客 2284

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spark-RPC框架解析之组件介绍及流程粗探

Spark-RPC框架涉及的组件概念介绍,相关发送信息的关键组件的流程解析

weixin_37990260的博客 1131

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spark2.x RPC解析

1、概述 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通、用户文件与Jar包的上传、节点间的Shuffle过程、Block数据的复制与备份等。Spark 2.0 之后,master 和worker 之间完全不使用akka 通信,改用netty实现。因为使用Akka要求message发送端和接收端有相同的版本,为了避免Akka造成的版本问题,给用户的应用更大灵活性,决定使...

fighting 1146

Spark源码分析(一):Master 启动

文章目录启动 master一、启动脚本: start-all.sh1.1 start-master.sh Master 脚本分析去到脚本: spark-daemon.sh1.2 start-slaves.sh Worker 脚本分析去到脚本:slave.sh 启动 master 一、启动脚本: start-all.sh #!/usr/bin/env bash # 如果配置了 SPARK_HOM...

Java_Road_Far的博客 950

Spark 源码分析(一):Spark Submit 任务提交

研究 Spark 内部是怎么运行的,怎么将 Spark 的任务从开始运行到结束的,先从 spark-submit 这个 shell 脚本提交用户程序开始。 我们一般提交 Spark 任务时,都会写一个如下的脚本,里面指定 spark-submit 脚本的位置,配置好一些参数,然后运行: ./bin/spark-submit \ --class <main-class> \ --...

朱磊的博客 1106

spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv

在前面源码剖析介绍中,spark 源码分析之二 -- SparkContext 的初始化过程中的SparkEnv和spark 源码分析之四 -- TaskScheduler的创建和启动过程中的ClientApp启动过程中,都涉及到了Spark的内置RPC的知识。本篇专门把RPC 拿出来剖析一下。 因为RPC 在 Spark 中内容虽然不多,但理清楚还是花费很多精力的,计划每天只剖...

weixin_30457465的博客 164

Spark 源码(2) - Spark Rpc 三剑客的理解

一、Spark Rpc 三剑客 谈到 Spark Rpc ,不得不提到 Spark Rpc 的三剑客:RpcEnv,RpcEndpoint,RpcEndpointRef。 如何理解他们呢,请看下图: 精简一下发送消息的过程为:通过 RpcEndpointRef 来发送一个消息给 RpcEnv,然后经过 Dispatcher 和 Inbox 的共同处理,发送给 RpcEndpoint 来处理(当前中间的过程比较复杂!)。 那什么是 Endpoint ,什么是 EndpointRef ? Endpoint 很

天道酬勤 296

spark2.0源码阅读 剖析spark RPC框架

spark2.0 剖析spark网络框架

u012106430的博客 835

Spark核心源码(一):spark-submit

1.Spark 源码相关目录介绍 spark 源码下载地址https://github.com/apache/spark 选择自己需要阅读的分支,目前spark 版本已经到3.0.0,因为目前线上使用的主要版本为2.3, 所以当前阅读源码还是以2.3 为主。 下图为整个spark源码的目录结构: bin 目录下存放的spark运行shell 相关的脚本,包括pyspark,sprkR,spark-shell,spark-sql等脚本。通过其中一个pyspark脚本分析,如何启动这些脚本的。 查看pysp

hey拉布拉多的博客 654
上一篇: java使用线程异步返回结果
下一篇: Spark源码解析(二)集群启动脚本分析
Yuan_CSDF
博客等级 码龄10年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值