Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本课主题
- Spark Worker 原理
- Worker 启动 Driver 源码鉴赏
- Worker 启动 Executor 源码鉴赏
- Worker 与 Master 的交互关系
Spark Worker 原理图

Worker 启动 Driver 源码鉴赏
- 因为 Worker 中有消息的循环体,可以用来接收消息,接上一章介绍当 Master 把一个 LaunchDriver 发送到 Worker 的时候,Worker 接收这个 LaunchDriver 然后创建一个新的 DriverRunner 实例,我们这里重点研究 LaunchDriver,当启动 Driver 或者是 Executor 的时候,它必需是满足内存的要求的。当实际上不一定会满足 Core 的要求的,也就是说实际分配的 Core 可能比你期待的 Core 多、也有可能比它少 (为什么呢?)

在这里首先创建一个 DriverRunner 的实例对象,然后把实例交给 drivers 数据结构 (HashMap[String, DriverRunner]) 来保存信息,这个数据结构很重要,因为在 Worker 下可能启动很多不同的 Executor,你可以理解 DriverRunner 为Driver 进程本身的一个proxy [代理模式],调用它的start( ) 方法并记录一下 coreUsed 和 memoryUsed 的数据。
Cluster 中的 Driver 失败的時候,如果 Supervise 為 true,則启动該 Driver 的Worker 会负责重新启动该 Driver;

- 在start( )的方法中会创建一个新的进程;具体代码运行顺序:new Thread( ) --> 创建一个本地目录和下载相关的 Jar包 --> launchDriver( ) --> 判断并收集它的状态 --> 再发送给 Worker 一个状态变化的消息。补充说明:Executor 和 ExecutorBackend 是一对一的关系,一个ExecutorBackend进程里面有一个Executor,而在Executor内部它是通过线程池并发处理的方式来处理我们 Spark 提交过来的 Task。Executor 启动后需要向 Driver 注册,具体是注册给 SparkDeploySchedulerBackend实例。

在本地创建了的一个工作目录
从 HDFS 上获取相关的依赖包 Jar 到本地,因为你提交程序的时候是提交给Spark集群的。
- Worker 是实现RPC通信的,否则别人无法给你发消息的,可以初步看一下类的说明,你会发现它是继承著 ThreadRpcEndPoint (在这里先不深入探讨 RpcEndPoint 的机制,如果想了解可以看点击这篇博客)
- 通过Command PrcoessBuilder



- 启动Driver e.g. launchDriver


DriverRunner 启动進程是通過 ProcessBuilder 中的 process.get.waitFor 來完成的。
当Driver 的状态改变的时候
- Worker 接收 DriverStatedChanged 信息



然后把信息发送给Master
Master 收到 Worker 发送过来的 Driver状态信息
- 判断Driver的状态然后把 ERROR、FINISHED、KILLED 和 FAILED 的 driver 删取掉


Worker 启动 Executor 源码鉴赏
- Worker 收到 LaunchExecutor 的信息





当Executor 的状态改变的时候
- 向 Worker 发送一个 ExecutorStatedChange 的信息

在Worker 中收到这个信息后调用 handleExecutorStateChanged 方法

Master 收到 Worker 发送过来的 Executor 状态信息
- Master 收到 Worker 的发送的 ExecutorStateChanged 信息



Worker 与 Master 的交互关系
[总结部份]
更新中......
Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等的更多相关文章
- [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...
- petite-vue源码剖析-ref的工作原理
ref内部的工作原理十分简单,其实就是将指令ref.:ref或v-bind:ref标识的元素实例存储到当前作用域的$refs对象中,那么我们就可以通过this.$refs获取对应的元素实例.但由于作用 ...
- Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结
本课主题 Master 资源调度的源码鉴赏 资源调度管理 任务调度与资源是通过 DAGScheduler.TaskScheduler.SchedulerBackend 等进行的作业调度 资源调度是指应 ...
- petite-vue源码剖析-双向绑定`v-model`的工作原理
前言 双向绑定v-model不仅仅是对可编辑HTML元素(select, input, textarea和附带[contenteditable=true])同时附加v-bind和v-on,而且还能利用 ...
- Redis源码剖析
Redis源码剖析和注释(一)---链表结构 Redis源码剖析和注释(二)--- 简单动态字符串 Redis源码剖析和注释(三)--- Redis 字典结构 Redis源码剖析和注释(四)--- 跳 ...
- Hadoop源码学习笔记之NameNode启动场景流程二:http server启动源码剖析
NameNodeHttpServer启动源码剖析,这一部分主要按以下步骤进行: 一.源码调用分析 二.伪代码调用流程梳理 三.http server服务流程图解 第一步,源码调用分析 前一篇文章已经锁 ...
- python源码剖析学习记录-01
学习<Python源码剖析-深度探索动态语言核心技术>教程 Python总体架构,运行流程 File Group: 1.Core Modules 内部模块,例如:imp ...
- 07.ElementUI 2.X 源码学习:源码剖析之工程化(二)
0x.00 前言 项目工程化系列文章链接如下,推荐按照顺序阅读文章 . 1️⃣ 源码剖析之工程化(一):项目概览.package.json.npm script 2️⃣ 源码剖析之工程化(二):项目构 ...
- 08.ElementUI 2.X 源码学习:源码剖析之工程化(三)
0x.00 前言 项目工程化系列文章链接如下,推荐按照顺序阅读文章 . 1️⃣ 源码剖析之工程化(一):项目概览.package.json.npm script 2️⃣ 源码剖析之工程化(二):项目构 ...
随机推荐
- PyCharm+cmd中使用Anaconda 与 新建Python环境(Windows)
PyCharm配置Anaconda Anaconda的安装在网上已经有了,这里主要讲之前已经安装了已经配置好Python环境变量以及PyCharm的情况下,使用Anaconda. 即在PyCharm中 ...
- 关于javascript中时间格式和时间戳的转换
当前时间获取的各种函数: var myDate = new Date();myDate.getYear(); //获取当前年份(2位),已经不推荐使用myDate.getFullYear ...
- js 字符串转dom 和dom 转字符串
js 字符串转dom 和dom 转字符串 博客分类: JavaScript 前言: 在javascript里面动态创建标准dom对象一般使用: var obj = document.createE ...
- Java - 多线程中的不变性问题
这篇记录一下保证并发安全性的策略之——不变性. (注意:是Immutable,不是Invariant!) 将一连串行为组织为一个原子操作以保证不变性条件,或者使用同步机制保证可见性,以防止读到失效数据 ...
- 简单的CRUD(二)
一.重构简单的CRUD 1.JDBC工具类 1.因为在crud中都包含一些相同的代码所以可以提取出来,抽取代码重构为工具类. 2.将工具类设置为static静态类,方便调用,不需要new对象. pub ...
- SQL语句整理(一) 数据库查询语言DQL
前言: 这是我学数据库时整理的学习资料,基本上包括了所以的SQL语句的知识点. 我的教材是人大王珊老师的<数据库系统概论>. 因为是手打的,所以会用一些细节打错了,但都挺明显也不多(考完试 ...
- javaweb中带标签体的自定义标签
1.完整的示例代码: 标签体的处理器类,JspFragmentTest.java package com.javaweb.tag; import java.io.IOException; import ...
- Android加载大图片实例详解
摘要:在Android下采用ARGB表示颜色,每个像素占四个字节.其加载图片申请空间时与图片的实际大小没有关系,与像素有关系.
- thinkphp怎么把数据库中的列的值存到下拉框中
1. 先去数据库中查值,查询整个数据表,结果为二维数组. $project = M("project"); $cell = $project->where(array('st ...
- css3之背景定位
属性: background-position: left top || left bottom || right top || right bottom || center center || 像素 ...