Spark Executor解析
目录
1、Spark Executor如何工作
2、Spark Executor工作源码
1、Spark Executor如何工作
当Driver发送过来Task的时候,其实是发送给CoarseGrainedExecutorBackend这个RPCEndpoint,而不是直接发送给Executor(Executor由于不是消息循环体永远也无法接收远程发过来的信息)。
Driver向ExecutorBackend发送LaunchTask,这里实际上是把内容交给线程池中的线程去执行。首先判断Executor是否为空,反序列化TaskDescription,然后调用Executor.launchTask ,launchTask 里面是将Task封装在TaskRunner(是一个runnable对象)里面然后交给线程池中的线程处理。在TaskRunner的run方法里面会导致runTask的执行。
2、Spark Executor工作源码
(1)Worker接收到Master发送过来启动Executor的指令,通过ExecutorRunner启动另外一个进程来运行Executor。在这个基础上会启动一个CoarseGrainedExecutorBackend(粗粒度),ExecutorBackend启动的时候这个时候要向Driver注册,通过RegisterExecutor。Driver(CoarseGrainedSchedulerBackend的内部成员DriverEndpoint接收注册)在接收到RegisterExecutor信息后会返回一个信息RegisteredExecutor给CoarseGrainedExecutorBackend。
CoarseGrainedExecutorBackend:是Executor运行所在的进程的名称,他本身不会完成具体任务的计算,这个进程里面有个Executor对象和CoarseGrainedExecutorBackend是一一对应的。
Executor:完成具体的计算,真正处理Task的对象,内部通过线程池的方式完成Task的计算。
(2)Driver的CoarseGrainedSchedulerBackend内部的成员DriverEndpoint收到RegisterExecutor后,首先判断ExecutorDataMap中是否有这个ExecutorId。ExecutorDataMap是个内存数据结构(他是CoarseGrainedSchedulerBackend的成员,所以最终是注册给CoarseGrainedSchedulerBackend),他是一个HashMap。
如果ExecutorDataMap中不存在,就进行注册,注册的时候先看看address存在不存在,如果存在直接获取,如果不存在就获取senderAddress。这从实现的角度看adress就是senderAddress。然后相关数据结构添加数据
CoarseGrainedSchedulerBackend.this.synchronized这里加上synchronized是因为集群中有很多ExecutorBackend向Driver注册,担心注册的时候写冲突,所以加上一个同步代码块
最后把消息发还给CoarseGrainedExecutorBackend
(3)CoarseGrainedExecutorBackend收到RegisterExecutor后就new了一个Executor这个Executor对象是事实上负责Task计算的
(4)在Executor默认构造器中有一个非常关键的内容,有个成员threadPool(线程池)
创建线程池,线程池里面要有线程,线程怎么产生的呢?不会平白无故的产生,所以就搞了一个线程工厂,就是按照某种你需要的格式去产生线程,背后还是new出一个线程
setDamon(True)设置每个线程是后台运行的方式
(5)线程池也准备好后就是等待Driver端发任务过来,是发给CoarseGrainedExecutorBackend不是Executor,因为Executor不可能接收到消息的他本身就不是一个消息循环体。CoarseGrainedExecutorBackend收到LaunchTask后,这里实际上是把内容交给线程池中的线程去执行。判断Executor是否为空,反序列化TaskDescription,然后调用Executor.launchTask
(6)launchTask 里面是将Task封装在TaskRunner(是一个runnable对象)里面然后交给线程池中的线程处理。并把这个任务加入ConcurrentHashMap类型的名称为runningTasks的数据结构中管理。
(7)在TaskRunner的run方法里面会导致runTask的执行
补充:为什么要在worker接收到master发送过来的指令后为什么要启动另外一个进程,也就是说为什么开辟另外一个进程,在另外一个进程中注册给Driver,然后启动Executor。必须启动另外一个进程的原因:①Worker本身是管理当前机器上的资源的,当前机器上的资源变动的时候要汇报给Master,Worker不是用来做计算的不能在Worker里面计算;②Spark集群中可能有很多应用程序就可能有很多的Executor,如果不是为每个Executor启动一个进程而是所有Executor在Worker里面,那么一个程序奔溃了会导致其他程序奔溃。
Spark Executor解析相关推荐
- Spark Shuffle 解析
5.Spark Shuffle 解析 5.1 Shuffle 的核心要点 5.1.1 ShuffleMapStage 与 FinalStage 在划分 stage 时,最后一个 stage 称为 Fi ...
- Spark内核解析1
Spark通讯架构 脚本探究: 概述 Spark 内核泛指 Spark 的核心运行机制,包括 Spark 核心组件的运行机制.Spark 任务调度机制.Spark 内存管理机制.Spark 核心功能的 ...
- 05_大数据技术之Spark内核解析(1.1)
1. Spark 内核概述 Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spa ...
- 小象学院源码共读之Executor解析
Executor解析 Executor解析 Executor类的初始化 线程池threadPool及taskReaperPool详解 子类TaskRunner详解 子类TaskReaper详解 参考内 ...
- spark原理解析和spark core
spark原理解析 解析一:resilient distributed dataset (RDD) resilient distributed dataset (RDD):弹性分布式数据集,有容错机制 ...
- Spark Executor内幕
Spark Executor工作原理 ExecutorBackend注册 Executor实例化 Executor具体是如何工作的? CoarseGrainedExecutorBackend,粗粒度的 ...
- Spark内核解析之六:Spark 内存管理
前言 在执行Spark 的应用程序时,Spark 集群会启动 Driver 和 Executor 两种 JVM 进程,前者为主控进程,负责创建 Spark 上下文,提交 Spark 作业(Job),并 ...
- Spark内核解析之一:内核概述
Spark 内核概述 Spark 内核泛指 Spark 的核心运行机制,包括 Spark 核心组件的运行机制.Spark任务调度机制.Spark 内存管理机制.Spark 核心功能的运行原理等,熟练掌 ...
- spark shell 启动 出现org.apache.spark.SparkException: Found both spark.executor.extraClassPath and SPARK
启动spark shell报错: Setting default log level to "WARN". To adjust logging level use sc.setLo ...
最新文章
- 树莓派 linux0.12,12 个可替代树莓派的单板机
- idea 代码自动补全快捷键
- ABAP 在字符串之间加入若干空格
- 全国计算机等级考试题库二级C操作题100套(第26套)
- (24) 不可能的出栈顺序
- Hello Blazor:(14)CSS隔离
- Java:对Java SE 6和Java SE 7的客户端和桌面部分的改进!
- MTK:GPIO模式与设置
- php点广告送积分,PHP猜一猜奇偶商城积分促销模式
- indesign打开黑屏 mac_看完这篇文章,90%的电脑黑屏问题都可以解决了!
- Redies(一款高性能的数据库)
- 一款简约好看的html5音乐播放器,一款好看又简洁的HTML5音乐播放器skPlayer
- 向已知EXCEL模板写入数据并导出
- 设备商网管软件定制开发案例分析
- android命令行启动,Android中使用am命令实现在命令行启动程序详解
- 计算机图形图像知识梳理,计算机图形学知识点总结
- idea指定maven的settings文件不生效
- ESP32学习笔记(9)——TCP服务端
- 原神服务器维护后抽奖池会更新吗,原神换up池会刷新保底吗
- 机器学习编译入门课程学习笔记第二讲 张量程序抽象