aaarticlea/png;base64,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" alt="" />
Worker类源码位置: org.apache.spark.deploy.worker
 
 
/**
*启动driver的源码分析
*/
case LaunchDriver(driverId, driverDesc) =>
logInfo(s"Asked to launch driver $driverId") //创建DriverRunner线程
val driver = new DriverRunner(
conf,
driverId,
workDir,
sparkHome,
driverDesc.copy(command = Worker.maybeUpdateSSLSettings(driverDesc.command, conf)),
self,
workerUri,
securityMgr) //把DriverRunner线程加入Drivers的hashset中
drivers(driverId) = driver //启动driver
driver.start() //详细代码见:代码1 coresUsed += driverDesc.cores
memoryUsed += driverDesc.mem 代码1
/** Starts a thread to run and manage the driver. */
private[worker] def start() = { //DriverRunner机制分析
//启动一个java线程
new Thread("DriverRunner for " + driverId) {
override def run() {
var shutdownHook: AnyRef = null
try {
shutdownHook = ShutdownHookManager.addShutdownHook { () =>
logInfo(s"Worker shutting down, killing driver $driverId")
kill()
} // prepare driver jars and run driver
// 在此处进行第一步:创建DriverRunner的工作目录
// 第二步,下载用户上传的jar(我们编写完的spark应用程序,如果是java,用maven打个jar包,如果是scala,那么会用export将它导出为jar包)
//第三步 构建ProcessBuilder
val exitCode = prepareAndRunDriver()//详细代码见:代码2 // set final state depending on if forcibly killed and process exit code
// 对driver的退出状态做一些处理
finalState = if (exitCode == ) {
Some(DriverState.FINISHED)
} else if (killed) {
Some(DriverState.KILLED)
} else {
Some(DriverState.FAILED)
}
} catch {
case e: Exception =>
kill()
finalState = Some(DriverState.ERROR)
finalException = Some(e)
} finally {
if (shutdownHook != null) {
ShutdownHookManager.removeShutdownHook(shutdownHook)
}
} // notify worker of final driver state, possible exception
// 这个DriverRunner这个线程,向它所属的worker的actor,发送一个DriverStateChanged的事件
worker.send(DriverStateChanged(driverId, finalState.get, finalException))//详细代码见:代码3
}
}.start()
} 代码2
private[worker] def prepareAndRunDriver(): Int = {
val driverDir = createWorkingDirectory()//创建DriverRunner的工作目录
val localJarFilename = downloadUserJar(driverDir)//第二步,下载用户上传的jar def substituteVariables(argument: String): String = argument match {
case "{{WORKER_URL}}" => workerUrl
case "{{USER_JAR}}" => localJarFilename
case other => other
} // TODO: If we add ability to submit multiple jars they should also be added here // 构建ProcessBuilder
// 传入了driver的启动命令,需要的内存大小等信息
val builder = CommandUtils.buildProcessBuilder(driverDesc.command, securityManager,
driverDesc.mem, sparkHome.getAbsolutePath, substituteVariables) runDriver(builder, driverDir, driverDesc.supervise)
} 代码3
//driver执行完以后,driverrunner线程会发送一个状态给worker
//然后worker实际上会将DriverStateChanged消息发送给Master
case driverStateChanged @ DriverStateChanged(driverId, state, exception) =>
handleDriverStateChanged(driverStateChanged)//详细代码见:代码4 代码4
private[worker] def handleDriverStateChanged(driverStateChanged: DriverStateChanged): Unit = {
val driverId = driverStateChanged.driverId
val exception = driverStateChanged.exception
val state = driverStateChanged.state
state match {
case DriverState.ERROR =>
logWarning(s"Driver $driverId failed with unrecoverable exception: ${exception.get}")
case DriverState.FAILED =>
logWarning(s"Driver $driverId exited with failure")
case DriverState.FINISHED =>
logInfo(s"Driver $driverId exited successfully")
case DriverState.KILLED =>
logInfo(s"Driver $driverId was killed by user")
case _ =>
logDebug(s"Driver $driverId changed state to $state")
} //worker把DriverStateChanged消息发送给Master
// Master会对状态进行修改
sendToMaster(driverStateChanged) //将driver从本地缓存中移除
val driver = drivers.remove(driverId).get //将driver加入完成driver的队列
finishedDrivers(driverId) = driver
trimFinishedDriversIfNecessary() //将driver的内存和CPU进行释放
memoryUsed -= driver.driverDesc.mem
coresUsed -= driver.driverDesc.cores
}
 
/**
*启动Executor的源码分析
*/
case LaunchExecutor(masterUrl, appId, execId, appDesc, cores_, memory_) =>
if (masterUrl != activeMasterUrl) {
logWarning("Invalid Master (" + masterUrl + ") attempted to launch executor.")
} else {
try {
logInfo("Asked to launch executor %s/%d for %s".format(appId, execId, appDesc.name)) // Create the executor's working directory
// 创建executor本地工作目录
val executorDir = new File(workDir, appId + "/" + execId)
if (!executorDir.mkdirs()) {
throw new IOException("Failed to create directory " + executorDir)
} // Create local dirs for the executor. These are passed to the executor via the
// SPARK_EXECUTOR_DIRS environment variable, and deleted by the Worker when the
// application finishes.
val appLocalDirs = appDirectories.getOrElse(appId,
Utils.getOrCreateLocalRootDirs(conf).map { dir =>
val appDir = Utils.createDirectory(dir, namePrefix = "executor")
Utils.chmod700(appDir)
appDir.getAbsolutePath()
}.toSeq)
appDirectories(appId) = appLocalDirs //创建ExecutorRunner
val manager = new ExecutorRunner(
appId,
execId,
appDesc.copy(command = Worker.maybeUpdateSSLSettings(appDesc.command, conf)),
cores_,
memory_,
self,
workerId,
host,
webUi.boundPort,
publicAddress,
sparkHome,
executorDir,
workerUri,
conf,
appLocalDirs, ExecutorState.RUNNING) //把executorRunner加入本地缓存
executors(appId + "/" + execId) = manager //启动ExecutorRunner
manager.start()//详细代码:见代码5 //加上Executor需要使用的CPU 内存的资源
coresUsed += cores_
memoryUsed += memory_ //向master返回一个ExecutorStateChanged事件,用于master修改状态
sendToMaster(ExecutorStateChanged(appId, execId, manager.state, None, None))
} catch {
case e: Exception =>
logError(s"Failed to launch executor $appId/$execId for ${appDesc.name}.", e)
if (executors.contains(appId + "/" + execId)) {
executors(appId + "/" + execId).kill()
executors -= appId + "/" + execId
}
sendToMaster(ExecutorStateChanged(appId, execId, ExecutorState.FAILED,
Some(e.toString), None))
}
} 代码5
private[worker] def start() { //创建一个java线程
workerThread = new Thread("ExecutorRunner for " + fullId) {
override def run() { fetchAndRunExecutor() }//详细代码见代码6
}
workerThread.start()
// Shutdown hook that kills actors on shutdown.
shutdownHook = ShutdownHookManager.addShutdownHook { () =>
// It's possible that we arrive here before calling `fetchAndRunExecutor`, then `state` will
// be `ExecutorState.RUNNING`. In this case, we should set `state` to `FAILED`.
if (state == ExecutorState.RUNNING) {
state = ExecutorState.FAILED
}
killProcess(Some("Worker shutting down")) }
} 代码6
/**
* Download and run the executor described in our ApplicationDescription
*/
private def fetchAndRunExecutor() {
try {
// Launch the process //封装一个ProcessBuilder
val builder = CommandUtils.buildProcessBuilder(appDesc.command, new SecurityManager(conf),
memory, sparkHome.getAbsolutePath, substituteVariables)
val command = builder.command()
val formattedCommand = command.asScala.mkString("\"", "\" \"", "\"")
logInfo(s"Launch command: $formattedCommand") builder.directory(executorDir)
builder.environment.put("SPARK_EXECUTOR_DIRS", appLocalDirs.mkString(File.pathSeparator))
// In case we are running this from within the Spark Shell, avoid creating a "scala"
// parent process for the executor command
builder.environment.put("SPARK_LAUNCH_WITH_SCALA", "") // Add webUI log urls
val baseUrl =
if (conf.getBoolean("spark.ui.reverseProxy", false)) {
s"/proxy/$workerId/logPage/?appId=$appId&executorId=$execId&logType="
} else {
s"http://$publicAddress:$webUiPort/logPage/?appId=$appId&executorId=$execId&logType="
}
builder.environment.put("SPARK_LOG_URL_STDERR", s"${baseUrl}stderr")
builder.environment.put("SPARK_LOG_URL_STDOUT", s"${baseUrl}stdout") process = builder.start() //重定向到输出流文件(将是stdout和stderr)
//将executor的InputStream和ErrorStream,输出的信息
//分贝重定向到本地工作目录的stdout文件,和stderr文件中
val header = "Spark Executor Command: %s\n%s\n\n".format(
formattedCommand, "=" * ) // Redirect its stdout and stderr to files
val stdout = new File(executorDir, "stdout")
stdoutAppender = FileAppender(process.getInputStream, stdout, conf) val stderr = new File(executorDir, "stderr")
Files.write(header, stderr, StandardCharsets.UTF_8)
stderrAppender = FileAppender(process.getErrorStream, stderr, conf) // Wait for it to exit; executor may exit with code 0 (when driver instructs it to shutdown)
// or with nonzero exit code
// 调用Proess的waitFor()方法,启动executor进程
val exitCode = process.waitFor() // executor执行完之后拿到返回值状态
state = ExecutorState.EXITED
val message = "Command exited with code " + exitCode //向ExecutorRunner线程所属的Worker actor,发送ExecutorStateChanged消息
worker.send(ExecutorStateChanged(appId, execId, state, Some(message), Some(exitCode)))//详细代码见:代码7
} catch {
case interrupted: InterruptedException =>
logInfo("Runner thread for executor " + fullId + " interrupted")
state = ExecutorState.KILLED
killProcess(None)
case e: Exception =>
logError("Error running executor", e)
state = ExecutorState.FAILED
killProcess(Some(e.toString))
}
} 代码7
//向master发送executorstatechanged事件
case executorStateChanged @ ExecutorStateChanged(appId, execId, state, message, exitStatus) =>
handleExecutorStateChanged(executorStateChanged)//详细代码见:代码8 代码8
private[worker] def handleExecutorStateChanged(executorStateChanged: ExecutorStateChanged):
Unit = { // 直接向master也发送一个executorstatechanged消息
sendToMaster(executorStateChanged)
val state = executorStateChanged.state // 如果executor状态是finished
if (ExecutorState.isFinished(state)) {
val appId = executorStateChanged.appId
val fullId = appId + "/" + executorStateChanged.execId
val message = executorStateChanged.message
val exitStatus = executorStateChanged.exitStatus
executors.get(fullId) match {
case Some(executor) =>
logInfo("Executor " + fullId + " finished with state " + state +
message.map(" message " + _).getOrElse("") +
exitStatus.map(" exitStatus " + _).getOrElse("")) // 将executor从内存中移除
executors -= fullId
finishedExecutors(fullId) = executor
trimFinishedExecutorsIfNecessary() // 释放executor占用的内存和CPU资源
coresUsed -= executor.cores
memoryUsed -= executor.memory
case None =>
logInfo("Unknown Executor " + fullId + " finished with state " + state +
message.map(" message " + _).getOrElse("") +
exitStatus.map(" exitStatus " + _).getOrElse(""))
}
maybeCleanupApplication(appId)
}
}
 

小记--------spark的worker原理分析及源码分析的更多相关文章

  1. 65、Spark Streaming:数据接收原理剖析与源码分析

    一.数据接收原理 二.源码分析 入口包org.apache.spark.streaming.receiver下ReceiverSupervisorImpl类的onStart()方法 ### overr ...

  2. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

  3. k8s client-go源码分析 informer源码分析(2)-初始化与启动分析

    k8s client-go源码分析 informer源码分析(2)-初始化与启动分析 前面一篇文章对k8s informer做了概要分析,本篇文章将对informer的初始化与启动进行分析. info ...

  4. k8s client-go源码分析 informer源码分析(3)-Reflector源码分析

    k8s client-go源码分析 informer源码分析(3)-Reflector源码分析 1.Reflector概述 Reflector从kube-apiserver中list&watc ...

  5. 66、Spark Streaming:数据处理原理剖析与源码分析(block与batch关系透彻解析)

    一.数据处理原理剖析 每隔我们设置的batch interval 的time,就去找ReceiverTracker,将其中的,从上次划分batch的时间,到目前为止的这个batch interval ...

  6. 64、Spark Streaming:StreamingContext初始化与Receiver启动原理剖析与源码分析

    一.StreamingContext源码分析 ###入口 org.apache.spark.streaming/StreamingContext.scala /** * 在创建和完成StreamCon ...

  7. 19、Executor原理剖析与源码分析

    一.原理图解 二.源码分析 1.Executor注册机制 worker中为Application启动的executor,实际上是启动了这个CoarseGrainedExecutorBackend进程: ...

  8. 18、TaskScheduler原理剖析与源码分析

    一.源码分析 ###入口 ###org.apache.spark.scheduler/DAGScheduler.scala // 最后,针对stage的task,创建TaskSet对象,调用taskS ...

  9. 22、BlockManager原理剖析与源码分析

    一.原理 1.图解 Driver上,有BlockManagerMaster,它的功能,就是负责对各个节点上的BlockManager内部管理的数据的元数据进行维护, 比如Block的增删改等操作,都会 ...

随机推荐

  1. 物联网是前端工程师的新蓝海吗? | Live笔记

    物联网是继 Web .无线之后的又一次重大技术变革,在变革的大潮中,程序员的知识体系和思维方式将面临全面更新. 前端开发的历史 在准备这个live的过程中,我回顾了前端开发短暂的历史,有几次我认为非常 ...

  2. Django-视图函数/模板渲染/过滤器

    一.Django的视图函数 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个 ...

  3. LG2216 理想的正方形

    题意 有一个\(a \times b\)的整数组成的矩阵,现请你从中找出一个\(n \times n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小 思路 对于每一列,都用两个单调队列维护 ...

  4. HTML5调用本地摄像头画面,拍照,上传服务器

    实现功能和适用业务 采集本地摄像头获取摄像头画面,拍照保存,上传服务器: 前端上传图片处理,展示,缩小,裁剪,上传服务器 实现步骤 调取本地摄像头(getUserMedia)/上传图片,将图片/视频显 ...

  5. Java写入的常用技巧(二)

    在一般从流接收数据写入介质的场景中,大部分存在每批次数据较小,导致小文件较多的问题. 一般考虑设置一个缓冲池,将多个批次的数据先缓冲进去,达到一定大小,再一次性批量写入 //公共缓冲池和缓冲池大小,如 ...

  6. A*算法解决15数码问题_Python实现

    1问题描述 数码问题常被用来演示如何在状态空间中生成动作序列.一个典型的例子是15数码问题,它是由放在一个4×4的16宫格棋盘中的15个数码(1-15)构成,棋盘中的一个单元是空的,它的邻接单元中的数 ...

  7. react 闲谈

    从事前端一段时间了,公司用的框架都是vue,但是不知为何对react却情有独钟,这是不是所谓的吃着碗里的看着锅里的 哈哈哈 从头好好总结下react吧 小白一个 大神勿喷 瞎说一 react是由两部分 ...

  8. Android解决AVD Hardware Buttons 和DPAD无法使用问题

    如图所示按键用鼠标点击时无法响应. 解决方案: 以我创建的AVD名为Tablet为例 1.找到用户目录(我的用户目录yummy),然后进入如下目录 mac: ~/yummy/.android/avd/ ...

  9. 从数组中找出所有组合为s的数

    java版本 package numCombine; /** * 从数组中找出所有组合为s的数 * @author root * */ public class NumComberAll { publ ...

  10. LC 969. Pancake Sorting

    Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length, t ...