• spark源码--worker启动原理和源码


    worker启动一般包含两大部分:DriverRunner和ExcetorRunner。

    worker启动driver的几个基本原理,最核心的是。worker内部会启动一个线程,这个线程可以理解为driverRunner。然后DriverRunner会去负责启动driver进程,并在之后对driver进程进行管理。

    worker的启动步骤:

    1- master要求worker启动driver和Excetor、launchDriver‘launchExcetor。

    2- worker在内部launchDriver启动了一个线程DriverRunner;创建driver的工作目录; 封装启动driver的命令,用processBuilder启动Driver。

    3- worker在内部通过LaunchExector启动一个ExectorRunner;创建Excetor的工作目录,封装启动Excetor的命令,用ProcessBuilder启动Excetor。

    4- Excetor找到对应的driver,去反向注册自己。

    LaunchDriver源码如下:
        case LaunchDriver(driverId, driverDesc) =>
          logInfo(s"Asked to launch driver $driverId")
          val driver = new DriverRunner(
            conf,
            driverId,
            workDir,
            sparkHome,
            driverDesc.copy(command = Worker.maybeUpdateSSLSettings(driverDesc.command, conf)),
            self,
            workerUri,
            securityMgr)
          drivers(driverId) = driver
          driver.start()
    
          coresUsed += driverDesc.cores
          memoryUsed += driverDesc.mem
    
        case KillDriver(driverId) =>
          logInfo(s"Asked to kill driver $driverId")
          drivers.get(driverId) match {
            case Some(runner) =>
              runner.kill()
            case None =>
              logError(s"Asked to kill unknown driver $driverId")
          }
    
        case driverStateChanged @ DriverStateChanged(driverId, state, exception) =>
          handleDriverStateChanged(driverStateChanged)
    
        case ReregisterWithMaster =>
          reregisterWithMaster()
    
        case ApplicationFinished(id) =>
          finishedApps += id
          maybeCleanupApplication(id)
      }
    LaunchExecutor的源码如下:
     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
              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, {
                val localRootDirs = Utils.getOrCreateLocalRootDirs(conf)
                val dirs = localRootDirs.flatMap { dir =>
                  try {
                    val appDir = Utils.createDirectory(dir, namePrefix = "executor")
                    Utils.chmod700(appDir)
                    Some(appDir.getAbsolutePath())
                  } catch {
                    case e: IOException =>
                      logWarning(s"${e.getMessage}. Ignoring this directory.")
                      None
                  }
                }.toSeq
                if (dirs.isEmpty) {
                  throw new IOException("No subfolder can be created in " +
                    s"${localRootDirs.mkString(",")}.")
                }
                dirs
              })
              appDirectories(appId) = appLocalDirs
              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)
              executors(appId + "/" + execId) = manager
              manager.start()
              coresUsed += cores_
              memoryUsed += memory_
              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))
            }
          }

    拓展:中华石杉--spark从入门到精通-第49讲

  • 相关阅读:
    Mysql 密码过期
    【Linux】 设置Linux的系统时间
    【Ubantu】ubantu 安装 .net core 3.0 的环境
    【Ubantu】Ubantu的常用命令
    【SQL】一个简单的查询所有层级(直到顶层)的sql语句
    【C++】C++中的异常解析
    【C++】C++中的类模板
    【Eclipse】Eclipse如何导出java项目为jar包
    【Kali】kali linux的安装和配置
    【Python】解析Python中的线程与进程
  • 原文地址:https://www.cnblogs.com/parent-absent-son/p/11747570.html
Copyright © 2020-2023  润新知