Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
本课主题
- Spark Executor 工作原理图
- ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕
- Executor 具体是如何工作的
Spark Executor 工作原理图

- 第一步:Master 发指令给 Worker 启动 Executor;
- 第二步:Worker 接收到 Master 发送过来的指令通过 ExecutorRunner 远程启动另外一个线程来运行 Executor;
- 第三步:通过发送 RegisterExecutor 向 Driver 注册 Executor,这个时侯Worker 会启动另外一个进程来向 Driver 发送注册的信息,思考题:为什么要多开一个新进程而不在原有的 Worker 进程里发送信息给 Driver 呢?因为Worker 主要是管理当前机器上的资源的,而当前机器上的资源有变动的时候需要汇报给 Master,Worker 不是用来计算的,所以不可以在 Worker 里做计算;而且,在 Spark 中可能有很多不同的的应用程序,有很多应用程序你就需要有很多 Executor,如果你不是为每个 Executor 启动一个进程的话,这会导致当一个程序崩溃时,其他程序也会崩溃。
需要特别注意的是在 CoarseGrainedExecutorBackend 启动时向 Driver 注册 Executor 其实质上是注册 ExecutorBackend 实例,和 Executor 实例之间没有直接关系! CoarseGrainedExecutorBackend 是 Executor 运行所在的进程名称,Executor 才是真正处理 Task 的对象Executor 内部是通过线程池的方式来完成 Task 的计算的,CoarseGrainedExecutorBackend 和 Executor 是一对一的关系


CoarseGrainedExecutorBackend 是一个消息通信体(其实现了 (ThreadSafeRpcEndPoint) ,可以发送信息给 Driver 并可以接受 Driver 中发过来的指令,例如启动 Task 等。
- 第四步:在 DriverEndpoint 中会接受到 RegisterExecutor 信息并完成在 Driver 上的注册,其实际是注册给 CoarseGrainedSchedulerBackend



在 Driver 进程中有两个至关重要的 Endpoint: (注册的内幕源码可以参考Spark天堂之门解密)
1) ClientEndpoint: 主要负责向 Master 注册当前的程序,是 AppClient 的内部成员;
2) DriverEndpoint: 这是整个程序运行时候的驱动器,是CoraseGraninedSchedulerBackend 的内部成员。 - 在 Driver 中通过 ExecutorData 封装并注册 ExecutorBackend 的信息到 Driver 的内存数据结构 executorMapData 中:

- 实际在执行的时候DriverEndpoint 会把信息写下CoarseGraninedSchedulerBackend 的内存数据结构executorMapData 中,所以说最终是注册给了CoarseGraninedSchedulerBackend,也就是说CoarseGraninedSchedulerBackend 掌握了为当前程序分配的所有的ExecutorBackend 进程,而每一个ExecutorBackend 进程实例中会通过Executor对象来负责具体Task 的运行。
- 在运行的时候使用 synchronised 关键字来保证 executorMapData 安全的并发写操作。
ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕
- CoarseGrainedExecutorBackend 收到 DriverEndpoint (CoraseGrainedSchedulerBackend) 发送过来的 RegisteredExecutor 消息后会启动 Executor 实例对象,而 Executor 实例对象是事实上负责真正的 Task 的计算的;



- Executor在实例化的时候会实例化一个线程池来准备 Task 的计算的。


Executor 具体是如何工作的
- 当 Driver 发送过来 Task 的时候,其实是发送给了 CoarseGrainedExecutorBackend 这个 RpcEndpoint ,而不是直接发送给了 Executor (Executor 由于不是消息循环体,所以永远也无法直接接受远程发过来的信息);
- ExecutorBackend 在收到 Driver 中发送过来的消息后会通过调用 LaunchTask 来交给 Executor 去执行:


- 创建的 threadPool 中以多线程并发执行和线程复用的方式来高效的执行 Spark 发过来的 Task,接收到 Task 执行的命令后,会首先把 Task 封装在 TaskRunner 里面,TaskRunner 其实是 Java 中的 Runnerable 接口的具体的实现,在真正工作的时候会交给线程池中的线池去运行,此时会调用 run 方法来执行 task,TaskRunner 在调用 run 方法的时候会调用 Task run方法,而 Task 的 run 方法会调用 runTask, 而实际 Task 有 ShuffleMapTask 和 ResultTask;

[总结部份]
更新中......
Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕的更多相关文章
- [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
本課主題 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 [引言部份:你希望读者看完这篇博客 ...
- [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...
- Spark Streaming updateStateByKey案例实战和内幕源码解密
本节课程主要分二个部分: 一.Spark Streaming updateStateByKey案例实战二.Spark Streaming updateStateByKey源码解密 第一部分: upda ...
- 基于HDFS的SparkStreaming案例实战和内幕源码解密
一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动sta ...
- MyBatis 源码分析——SqlSession接口和Executor类
mybatis框架在操作数据的时候,离不开SqlSession接口实例类的作用.可以说SqlSession接口实例是开发过程中打交道最多的一个类.即是DefaultSqlSession类.如果笔者记得 ...
- mybatis源码解析9---执行器Executor解析
从前面分析我们知道了sql的具体执行是通过调用SqlSession接口的对应的方法去执行的,而SqlSession最终都是通过调用了自己的Executor对象的query和update去执行的.本文就 ...
- Kakfa揭秘 Day6 Consumer源码解密
Kakfa揭秘 Day6 Consumer源码解密 今天主要分析下Consumer是怎么来工作的,今天主要是例子出发,对整个过程进行刨析. 简单例子 Example中Consumer.java是一个简 ...
- Kakfa揭秘 Day7 Producer源码解密
Kakfa揭秘 Day7 Producer源码解密 今天我们来研究下Producer.Producer的主要作用就是向Kafka的brokers发送数据.从思考角度,为了简化思考过程,可以简化为一个单 ...
- Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本课主题 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 Spark Worke ...
随机推荐
- Git学习系列之Git产生的背景
不多说,直接上干货! 史上最浅显易懂的Git教程! 为什么要编写这个教程?因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指 ...
- ArrayList、Vector和LinkedList等的差别与用法(基础回顾)
ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都容许直接序号索引元素,然则插入数据要设计到数组元素移动等内存操纵,所以索引数据快插入数 ...
- 【Css】Layout布局(一)
看下图: css框模型(Box Model),也有叫做盒模型的.规定了元素框处理元素内容.内边距.边框 和 外边距 的方式. element元素,也是内容的主体: padding内边距,也右称为填充的 ...
- JPA为字段设置默认值
http://blog.csdn.net/u011983531/article/details/51286839 在使用JPA时,如果需要为属性设置默认值,很自然的,你可能会想到用下面的方式. @Co ...
- Python基础(5) - 文件
Python Python提供的函数和方法方便地对文件进行读.写.删除等的操作. open()函数返回一个文件对象. open(name[, mode[, buffering]]) -> fil ...
- Golang教程:包
什么是包?为什么使用包? 到目前为止我们见到的 Go 程序都只有一个文件,文件中包含了一个main函数和几个其他函数.在实际中这种将所有代码都放在一个文件里的组织方式是不可行的.这样的组织方式使得代码 ...
- 架构实战项目心得(九):后台服务工具ldap:统一用户中心ldap工具使用以及安装
一.安装OpenLDAP 1.安装 yum -y install openldapopenldap-servers openldap-clients openldap-devel compat-ope ...
- .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
dump文件相信有些朋友已经很熟悉了,dump文件的作用在于保存进程运行时的堆栈信息,方便日后排查软件故障,提升软件质量.关于dump分析工具windbg.adplus的文章更多了,如果您还不知道怎么 ...
- VUE的两种跳转push和replace对比区别
router.push(location) 在vue.js中想要跳转到不同的 URL,需要使用 router.push 方法. 这个方法会向 history 栈添加一个新的记录,当用户点击浏览器后退按 ...
- 爬虫之lxml - etree - xpath的使用
# 解析原理: # - 获取页面源码数据 # - 实例化一个etree对象,并且将页面源码数据加载到该对象中 # - 调用该对象的xpath方法进行指定标签定位 # - xpath函数必须结合着xpa ...