Spark系列(八)Worker工作原理
工作原理图
源代码分析
包名:org.apache.spark.deploy.worker
启动driver入口点:registerWithMaster方法中的case LaunchDriver
1 | ) => DriverState.FINISHED |
37 | case _ => DriverState.FAILED |
38 | } |
39 | } |
40 | |
41 | finalState = Some(state) |
42 | // 向Driver所属worker发送DriverStateChanged消息 |
43 | worker ! DriverStateChanged(driverId, state, finalException) |
44 | } |
45 | }.start() |
46 | } |
LaunchExecutor
管理LaunchExecutor的启动
1 | case LaunchExecutor(masterUrl, appId, execId, appDesc, cores_, memory_) => |
2 | if (masterUrl != activeMasterUrl) { |
3 | logWarning("Invalid Master (" + masterUrl + ") attempted to launch executor.") |
4 | } else { |
5 | try { |
6 | logInfo("Asked to launch executor %s/%d for %s".format(appId, execId, appDesc.name)) |
7 | |
8 | // Create the executor's working directory |
9 | // 创建executor本地工作目录 |
10 | val executorDir = new File(workDir, appId + "/" + execId) |
11 | if (!executorDir.mkdirs()) { |
12 | throw new IOException("Failed to create directory " + executorDir) |
13 | } |
14 | |
15 | // Create local dirs for the executor. These are passed to the executor via the |
16 | // SPARK_LOCAL_DIRS environment variable, and deleted by the Worker when the |
17 | // application finishes. |
18 | val appLocalDirs = appDirectories.get(appId).getOrElse { |
19 | Utils.getOrCreateLocalRootDirs(conf).map { dir => |
20 | Utils.createDirectory(dir).getAbsolutePath() |
21 | }.toSeq |
22 | } |
23 | appDirectories(appId) = appLocalDirs |
24 | // 创建ExecutorRunner对象 |
25 | val manager = new ExecutorRunner( |
26 | appId, |
27 | execId, |
28 | appDesc.copy(command = Worker.maybeUpdateSSLSettings(appDesc.command, conf)), |
29 | cores_, |
30 | memory_, |
31 | self, |
32 | workerId, |
33 | host, |
34 | webUi.boundPort, |
35 | publicAddress, |
36 | sparkHome, |
37 | executorDir, |
38 | akkaUrl, |
39 | conf, |
40 | appLocalDirs, ExecutorState.LOADING) |
41 | // executor加入本地缓存 |
42 | executors(appId + "/" + execId) = manager |
43 | manager.start() |
44 | // 增加worker已使用core |
45 | coresUsed += cores_ |
46 | // 增加worker已使用memory |
47 | memoryUsed += memory_ |
48 | // 通知master发送ExecutorStateChanged消息 |
49 | master ! ExecutorStateChanged(appId, execId, manager.state, None, None) |
50 | } |
51 | // 异常情况处理,通知master发送ExecutorStateChanged FAILED消息 |
52 | catch { |
53 | case e: Exception => { |
54 | logError(s"Failed to launch executor $appId/$execId for ${appDesc.name}.", e) |
55 | if (executors.contains(appId + "/" + execId)) { |
56 | executors(appId + "/" + execId).kill() |
57 | executors -= appId + "/" + execId |
58 | } |
59 | master ! ExecutorStateChanged(appId, execId, ExecutorState.FAILED, |
60 | Some(e.toString), None) |
61 | } |
62 | } |
63 | } |
总结
1、Worker、Driver、Application启动后都会向Master进行注册,并缓存到Master内存数据模型中
2、完成注册后发送LaunchExecutor、LaunchDriver到Worker
3、Worker收到消息后启动executor和driver进程,并调用Worker的ExecutorStateChanged和DriverStateChanged方法
4、发送ExecutorStateChanged和DriverStateChanged消息到Master的,根据各自的状态信息进行处理,最重要的是会调用schedule方法进行资源的重新调度
Spark系列(八)Worker工作原理的更多相关文章
- Spark系列(十)TaskSchedule工作原理
工作原理图 源码分析: 1.) 25 launchedTask = true 26 } 27 } catch { 28 ...
- Spark系列(九)DAGScheduler工作原理
以wordcount为示例进行深入分析 1 33 ) { 46 logInfo("Submitting " + tasks.size + " missi ...
- line-height系列——定义和工作原理总结
一.line-height的定义和工作原理总结 line-height的属性值: normal 默认 设置合理的行间距. number 设置数字,此数字会与当前的字体尺寸相乘来设置行间距li ...
- 源码分析八( hashmap工作原理)
首先从一条简单的语句开始,创建了一个hashmap对象: Map<String,String> hashmap = new HashMap<String,String>(); ...
- [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- How Javascript works (Javascript工作原理) (八) WebAssembly 对比 JavaScript 及其使用场景
个人总结: webworker有以下三种: Dedicated Workers 由主进程实例化并且只能与之进行通信 Shared Workers 可以被运行在同源的所有进程访问(不同的浏览的选项卡,内 ...
- 49、Spark Streaming基本工作原理
一.大数据实时计算介绍 1.概述 Spark Streaming,其实就是一种Spark提供的,对于大数据,进行实时计算的一种框架.它的底层,其实,也是基于我们之前讲解的Spark Core的. 基本 ...
- 46、Spark SQL工作原理剖析以及性能优化
一.工作原理剖析 1.图解 二.性能优化 1.设置Shuffle过程中的并行度:spark.sql.shuffle.partitions(SQLContext.setConf()) 2.在Hive数据 ...
随机推荐
- class卸载、热替换和Tomcat的热部署的分析
一 class的热替换 ClassLoader中重要的方法 loadClassClassLoader.loadClass(...) 是ClassLoader的入口点.当一个类没有指明用什么加载器加载的 ...
- Linux下安装、配置、启动Apache
http://www.cnblogs.com/zhuque/archive/2012/11/03/2763352.html#
- PHP大神的十大优良习惯
概述:通往PHP大神的道路上,应该保持优良的传统和习惯. 1.多阅读手册和源代码 没什么比阅读手册更值得强调的事了–仅仅通过阅读手册你就可以学习到很多东西,特别是很多有关于字符串和数组的函数.就在这些 ...
- VC6.0下string不能用pusk_back,可用+=代替
2013-09-11 21:14:32 在VS下运行正确的代码,拿到VC6.0下,编译出错,提示: error C2039: 'push_back' : is not a member of 'bas ...
- 内存分配方法 kmalloc()、vmalloc()、__get_free_pages()
Copyright: 该文章版权由潘云登所有.可在非商业目的下任意传播和复制. 对于商业目的下对本文的任何行为需经作者同意. kmalloc #include <linux/slab.h> ...
- 5 commands to check memory usage on Linux
Memory Usage On linux, there are commands for almost everything, because the gui might not be always ...
- hdu 4973 A simple simulation problem. (线段树)
题目链接 题意: 给定n长的序列 m个操作 序列默认为 1, 2, 3···n 操作1:D [l,r] 把[l,r]区间增长 :( 1,2,3,4 进行 D [1,3]变成 1,1,2,2,3,3,4 ...
- POJ3485 区间问题
题目描述有些坑.. 题意: 有一条高速公路在x轴上,从(0,0)到(L,0).周围有一些村庄,希望能够在高速公路上开通几个出口,使得每个村庄到最近的出口距离小于D,求出最少需要开通多少个出口. 解题思 ...
- WinScp上传和下载
不多说,贴代码,看不懂得可以留言.需要引入WinSCP public class WebWinScp { //远程上传路径 private SessionOptions sessionOptions ...
- bzoj3955
首先,最短路不同的两辆车一定不会发生堵塞 对于最短路相同的点,我们把属于最短路径上的边拎出来建图跑最大流即可 然后我TLE了…… 因为很明显建出来图很大,而真正流的流量很小 普通的初始标号都是0的sa ...