Spark源码解读之SparkContext初始化

【Spark】SparkContext源码解读 SparkContext的初始化SparkContext是应用启动时创建的Spark上下文对象,是进行Spark应用开发的主要接口,是Spark上层应用与底层实现的中转站(SparkContext负责给executors发送task)。 SparkContext在初始化过程中,主要涉及一下内容: SparkEnv DAGScheduler TaskScheduler Sche 阅读详情

SparkContext初始化是Driver应用程序提交执行的前提,这里以local模式来了解SparkContext的初始化过程。

本文以

val conf = new SparkConf().setAppName("mytest").setMaster("local[2]")
val sc = new SparkContext(conf)

为例,打开debug模式,然后进行分析。

一、SparkConf概述

    SparkContext需要传入SparkConf来进行初始化,SparkConf用于维护Spark的配置属性。官方解释:

Configuration for a Spark application. Used to set various Spark parameters as key-value pairs.
简单看下SparkConf的源码:

class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging {

  import SparkConf._

  /** Create a SparkConf that loads defaults from system properties and the classpath */
  def this() = this(true)

  private val settings = new ConcurrentHashMap[String, String]()

  if (loadDefaults) {
    // Load any spark.* system properties
    for ((key, value) <- Utils.getSystemProperties if key.startsWith("spark.")) {
      set(key, value)
    }
  }

  /** Set a configuration variable. */
  def set(key: String, value: String): SparkConf = {
    if (key == null) {
      throw new NullPointerException("null key")
    }
    if (value == null) {
      throw new NullPointerException("null value for " + key)
    }
    logDeprecationWarning(key)
    settings.put(key, value)
    this
  }

  /**
   * The master URL to connect to, such as "local" to run locally with one thread, "local[4]" to
   * run locally with 4 cores, or "spark://master:7077" to run on a Spark standalone cluster.
   */
  def setMaster(master: String): SparkConf = {
    set("spark.master", master)
  }

  /** Set a name for your application. Shown in the Spark web UI. */
  def setAppName(name: String): SparkConf = {
    set("spark.app.name", name)
  }
//省略
}

SparkConf内部使用ConcurrentHashMap来维护所有的配置。由于SparkConf提供的setter方法返回的是this,也就是

一个SparkConf对象,所有它允许使用链式来设置属性。

如:new SparkConf().setAppName("mytest").setMaster("local[2]")


二、SparkContext的初始化

SparkContext的初始化步骤主要包含以下几步:

1)创建JobProgressListener

2)创建SparkEnv

3)创建


1. 复制SparkConf配置信息,然后校验或者添加新的配置信息

SparkContext的住构造器参数为SparkConf: 

class SparkContext(config: SparkConf) extends Logging with ExecutorAllocationClient {

  // The call site where this SparkContext was constructed.
  private val creationSite: CallSite = Utils.getCallSite()

  // If true, log warnings instead of throwing exceptions when multiple SparkContexts are active
  private val allowMultipleContexts: Boolean =
    config.getBoolean("spark.driver.allowMultipleContexts", false)

  // In order to prevent multiple SparkContexts from being active at the same time, mark this
  // context as having started construction.
  // NOTE: this must be placed at the beginning of the SparkContext constructor.
  SparkContext.markPartiallyConstructed(this, allowMultipleContexts)
//省略
}

    getCallSite方法会得到一个CallSite对象,改对象存储了线程栈中最靠近栈顶的用户类及最靠近栈底的Scala或者Spark核心类信息。SparkContext默认只有一个实例,由属性"spark.driver.allowMultipleContexts"来控制。markPartiallyConstructed方法用于确保实例的唯一性,并将当前SparkContext标记为正在构建中。

    之后会初始化一些其他实例对象,比如会在内部创建一个SparkConf类型的对象_conf,然后在将传过来的config进行复制,然后会对配置信息进行校验。

private var _conf: SparkConf = _
...

_conf = config.clone()
_conf.validateSettings()  // Checks for illegal or deprecated config settings

if (!_conf.contains("spark.master")) {
  throw new SparkException("A master URL must be set in your configuration")
}
if (!_conf.contains("spark.app.name")) {
  throw new SparkException("An application name must be set in your configuration")
}

从上面代码可以看出,必须要指定spark.master(运行模式)和spark.app.name(应用程序名称),否则会抛出异常。


2. 创建SparkEnv

    SparkEnv包含了一个Spark应用的运行环境对象。官方解释:

* Holds all the runtime environment objects for a running Spark instance (either master or worker),
* including the serializer, Akka actor system, block manager, map output tracker, etc. Currently
* Spark code finds the SparkEnv through a global variable, so all the threads can access the same
* SparkEnv. It can be accessed by SparkEnv.get (e.g. after creating a SparkContext).

   上面的意思大概就是说SparkEnv包含了Spark实例(master or worker)运行时的环境对象,包括serializer, Akka actor system, block manager, map output tracker等等。

    SparkContext中创建SparkEnv实例的部分代码:

// An asynchronous listener bus for Spark events
private[spark] val listenerBus = new LiveListenerBus

// This function allows components created by SparkEnv to be mocked in unit tests:
private[spark] def createSparkEnv(
    conf: SparkConf,
    isLocal: Boolean,
    listenerBus: LiveListenerBus): SparkEnv = {
  SparkEnv.createDriverEnv(conf, isLocal, listenerBus, SparkContext.numDriverCores(master))
}

...

// "_jobProgressListener" should be set up before creating SparkEnv because when creating
// "SparkEnv", some messages will be posted to "listenerBus" and we should not miss them.
_jobProgressListener = new JobProgressListener(_conf)
listenerBus.addListener(jobProgressListener)

// Create the Spark execution environment (cache, map output tracker, etc)
_env = createSparkEnv(_conf, isLocal, listenerBus)
SparkEnv.set(_env)

也就是说最后会调用SparkEnv.createDriverEnv方法

/**
* Create a SparkEnv for the driver.
*/
private[spark] def createDriverEnv(
  conf: SparkConf,
  isLocal: Boolean,
  listenerBus: LiveListenerBus,
  numCores: Int,
  mockOutputCommitCoordinator: Option[OutputCommitCoordinator] = None): SparkEnv = {
	assert(conf.contains("spark.driver.host"), "spark.driver.host is not set on the driver!")
	assert(conf.contains("spark.driver.port"), "spark.driver.port is not set on the driver!")
	val hostname = conf.get("spark.driver.host")
	val port = conf.get("spark.driver.port").toInt
	create(
	  conf,
	  SparkContext.DRIVER_IDENTIFIER,
	  hostname,
	  port,
	  isDriver = true,
	  isLocal = isLocal,
	  numUsableCores = numCores,
	  listenerBus = listenerBus,
	  mockOutputCommitCoordinator = mockOutputCommitCoordinator
	)
}

private def create(
	conf: SparkConf,
	executorId: String,
	hostname: String,
	port: Int,
	isDriver: Boolean,
	isLocal: Boolean,
	numUsableCores: Int,
	listenerBus: LiveListenerBus = null,
	mockOutputCommitCoordinator: Option[OutputCommitCoordinator] = None): SparkEnv = {
	
...

	val envInstance = new SparkEnv(
	  executorId,
	  rpcEnv,
	  actorSystem,  // 基于Akka的分布式消息系统
	  serializer,
	  closureSerializer,
	  cacheManager,  // 缓存管理器
	  mapOutputTracker,  // map任务输出跟踪器
	  shuffleManager,  // shuffle管理器
	  broadcastManager,  // 广播管理器
	  blockTransferService,  //块传输服务
	  blockManager,  // 块管理器
	  securityManager,  // 安全管理器
	  sparkFilesDir,  // 
	  metricsSystem,  // 测量系统
	  memoryManager,  // 内存管理器
	  outputCommitCoordinator,
	  conf)  
	  
...

}

     SparkEnv的createDriverEnv方法会调用私有create方法来创建serializer,closureSerializer,cacheManager等,创建完成后会创建SparkEnv对象。


3. 创建MetadataCleaner

    MetadataCleaner是用来定时的清理metadata的,metadata有6种类型,封装在了MetadataCleanerType类中。

private[spark] object MetadataCleanerType extends Enumeration {

  val MAP_OUTPUT_TRACKER, SPARK_CONTEXT, HTTP_BROADCAST, BLOCK_MANAGER,
  SHUFFLE_BLOCK_MANAGER, BROADCAST_VARS = Value

  type MetadataCleanerType = Value

  def systemProperty(which: MetadataCleanerType.MetadataCleanerType): String = {
    "spark.cleaner.ttl." + which.toString
  }
}

MAP_OUTPUT_TRACKER:map任务的输出元数据,SPARK_CONTEXT:缓存到内存中的RDD,HTTP_BROADCAST:采用http方式广播broadcast的元数据,BLOCK_MANAGER:BlockManager中非Broadcast类型的Block数据,SHUFFLE_BLOCK_MANAGER:shuffle输出的数据,BROADCAST_VARS:Torrent方式广播broadcast的元数据,底层依赖于BlockManager。

    在SparkContext初始化的过程中,会创建一个MetadataCleaner,用于清理缓存到内存中的RDD。

  // Keeps track of all persisted RDDs
  private[spark] val persistentRdds = new TimeStampedWeakValueHashMap[Int, RDD[_]]
  
  /** Called by MetadataCleaner to clean up the persistentRdds map periodically */
  private[spark] def cleanup(cleanupTime: Long) {
    persistentRdds.clearOldValues(cleanupTime)
  }
  
  _metadataCleaner = new MetadataCleaner(MetadataCleanerType.SPARK_CONTEXT, this.cleanup, _conf)


4. 创建SparkStatusTracker

    SparkStatusTracker是低级别的状态报告API,用于监控job和stage。


5. 初始化Spark UI

    SparkUI为Spark监控Web平台提供了Spark环境、任务的整个生命周期的监控。


6.  HadoopConfiguration

    由于Spark默认使用HDFS作为分布式文件系统,所以需要获取Hadoop相关的配置信息。

_hadoopConfiguration = SparkHadoopUtil.get.newConfiguration(_conf)

可以看下newConfiguration做了那些事情。

  def newConfiguration(conf: SparkConf): Configuration = {
    val hadoopConf = new Configuration()

    // Note: this null check is around more than just access to the "conf" object to maintain
    // the behavior of the old implementation of this code, for backwards compatibility.
    if (conf != null) {
      // Explicitly check for S3 environment variables
      if (System.getenv("AWS_ACCESS_KEY_ID") != null &&
          System.getenv("AWS_SECRET_ACCESS_KEY") != null) {
        val keyId = System.getenv("AWS_ACCESS_KEY_ID")
        val accessKey = System.getenv("AWS_SECRET_ACCESS_KEY")

        hadoopConf.set("fs.s3.awsAccessKeyId", keyId)
        hadoopConf.set("fs.s3n.awsAccessKeyId", keyId)
        hadoopConf.set("fs.s3a.access.key", keyId)
        hadoopConf.set("fs.s3.awsSecretAccessKey", accessKey)
        hadoopConf.set("fs.s3n.awsSecretAccessKey", accessKey)
        hadoopConf.set("fs.s3a.secret.key", accessKey)
      }
      // Copy any "spark.hadoop.foo=bar" system properties into conf as "foo=bar"
      conf.getAll.foreach { case (key, value) =>
        if (key.startsWith("spark.hadoop.")) {
          hadoopConf.set(key.substring("spark.hadoop.".length), value)
        }
      }
      val bufferSize = conf.get("spark.buffer.size", "65536")
      hadoopConf.set("io.file.buffer.size", bufferSize)
    }

    hadoopConf
  }

1)将Amazon S3文件系统的AccessKeyId和SecretAccessKey加载到Hadoop的Configuration。

2)将SparkConf中所有以spark.hadoop.开头的属性复制到Hadoop的Configuration。

3)将SparkConf的spark.buffer.size属性复制为Hadoop的Configuration的io.file.buffer.size属性。


7.  ExecutorEnvs

    ExecutorEnvs包含的环境变量会在注册应用时发送给Master,Master给Worker发送调度后,Worker最终使用executorEnvs提供的信息启动Executor。

private[spark] val executorEnvs = HashMap[String, String]()

// Convert java options to env vars as a work around
// since we can't set env vars directly in sbt.
for { (envKey, propKey) <- Seq(("SPARK_TESTING", "spark.testing"))
  value <- Option(System.getenv(envKey)).orElse(Option(System.getProperty(propKey)))} {
  executorEnvs(envKey) = value
}
Option(System.getenv("SPARK_PREPEND_CLASSES")).foreach { v =>
  executorEnvs("SPARK_PREPEND_CLASSES") = v
}
// The Mesos scheduler backend relies on this environment variable to set executor memory.
// TODO: Set this only in the Mesos scheduler.
executorEnvs("SPARK_EXECUTOR_MEMORY") = executorMemory + "m"
executorEnvs ++= _conf.getExecutorEnv
executorEnvs("SPARK_USER") = sparkUser

    由上面代码克制,可以通过配置spark.executor.memory指定Executor占用内存的大小,也可以配置系统变量

SPARK_EXECUTOR_MEMORY或SPARK_MEM对其大小进行设置。


8. 注册HeartbeatReceiver    

  We need to register "HeartbeatReceiver" before "createTaskScheduler" because Executor will retrieve "HeartbeatReceiver" in the constructor. (SPARK-6640)

    _heartbeatReceiver = env.rpcEnv.setupEndpoint(
      HeartbeatReceiver.ENDPOINT_NAME, new HeartbeatReceiver(this))


9. 创建TaskScheduler

    TaskScheduler为Spark的任务调度器,Spark通过它提交任务并且请求集群调度任务;TaskScheduler通过master的配置匹配部署模式,创建TashSchedulerImpl,根据不同的集群管理模式(local、local[n]、standalone、local-cluster、mesos、YARN)创建不同的SchedulerBackend。

    val (sched, ts) = SparkContext.createTaskScheduler(this, master)
    _schedulerBackend = sched
    _taskScheduler = ts

createTaskScheduler方法会使用模式匹配来创建不同的 TaskSchedulerImpl和Backend。由于这儿使用的是本地模式,所以返回LocalBackend。

      case LOCAL_N_REGEX(threads) =>
      def localCpuCount: Int = Runtime.getRuntime.availableProcessors()
      // local[*] estimates the number of cores on the machine; local[N] uses exactly N threads.
      val threadCount = if (threads == "*") localCpuCount else threads.toInt
      if (threadCount <= 0) {
        throw new SparkException(s"Asked to run locally with $threadCount threads")
      }
      val scheduler = new TaskSchedulerImpl(sc, MAX_LOCAL_TASK_FAILURES, isLocal = true)
      val backend = new LocalBackend(sc.getConf, scheduler, threadCount)
      scheduler.initialize(backend)
      (backend, scheduler)

9.1 创建TaskSchedulerImpl

    TaskSchedulerImpl构造过程如下:

    1)从SparkConf中读取配置信息,包括每个任务分配的CPU数,迪奥多事(FAIR或FIFO,默认为FIFO)

  val conf = sc.conf

  // How often to check for speculative tasks
  val SPECULATION_INTERVAL_MS = conf.getTimeAsMs("spark.speculation.interval", "100ms")

  private val speculationScheduler =
    ThreadUtils.newDaemonSingleThreadScheduledExecutor("task-scheduler-speculation")

  // Threshold above which we warn user initial TaskSet may be starved
  val STARVATION_TIMEOUT_MS = conf.getTimeAsMs("spark.starvation.timeout", "15s")

  // CPUs to request per task
  val CPUS_PER_TASK = conf.getInt("spark.task.cpus", 1)
  
  ...
  
  // default scheduler is FIFO
  private val schedulingModeConf = conf.get("spark.scheduler.mode", "FIFO")

    2)创建TaskResultGetter,它的作用是:

  Runs a thread pool that deserializes and remotely fetches (if necessary) task results.

通过线程池对Worker上的Executor发送的Task的执行结果进行处理。默认会通过Executors.newFixedThreadPool创建一个包含4个、线程名以task-result-getter开头的线程池。

  private val THREADS = sparkEnv.conf.getInt("spark.resultGetter.threads", 4)
  private val getTaskResultExecutor = ThreadUtils.newDaemonFixedThreadPool(
    THREADS, "task-result-getter")

TaskSchedulerImpl的调度模式有FAIR和FIFO两种。任务的最终调度实际都是有SchedulerBackend实现的。local模式下的SchedulerBackend为LocalBackend。


9.2 TaskSchedulerImpl的初始化

    创建完TaskSchedulerImpl和LocalBackend后,需要对TaskSchedulerImpl调用initializeinitialize方法进行初始化。以默认的FIFO调度为例,TaskSchedulerImpl初始化过程如下。

  def initialize(backend: SchedulerBackend) {
    this.backend = backend
    // temporarily set rootPool name to empty
    rootPool = new Pool("", schedulingMode, 0, 0)
    schedulableBuilder = {
      schedulingMode match {
        case SchedulingMode.FIFO =>
          new FIFOSchedulableBuilder(rootPool)
        case SchedulingMode.FAIR =>
          new FairSchedulableBuilder(rootPool, conf)
      }
    }
    schedulableBuilder.buildPools()
  }

1) 使TaskSchedulerImpl持有LocalBackend的引用

2)创建Pool,Pool中缓存了调度队列,调度算法以及TaskSetManager集合等信息。

3)创建FIFOSchedulableBuilder,FIFOSchedulableBuilder用来操作Pool中的调度队列。


10. 创建DAGScheduler

    DAGScheduler的主要作用是在TaskSchedulerImpl正式提交任务之前做一些准备工作,包括:创建Job,将DAG中的RDD划分到不同的Stage,提交Stage等等。DAGScheduler的创建代码如下:

    _dagScheduler = new DAGScheduler(this)
    _heartbeatReceiver.ask[Boolean](TaskSchedulerIsSet)

    // start TaskScheduler after taskScheduler sets DAGScheduler reference in DAGScheduler's
    // constructor
    _taskScheduler.start()

11. 启动TaskScheduler

    启动TaskScheduler时,实际上调用量backend的start方法。

  override def start() {
    backend.start()

    if (!isLocal && conf.getBoolean("spark.speculation", false)) {
      logInfo("Starting speculative execution thread")
      speculationScheduler.scheduleAtFixedRate(new Runnable {
        override def run(): Unit = Utils.tryOrStopSparkContext(sc) {
          checkSpeculatableTasks()
        }
      }, SPECULATION_INTERVAL_MS, SPECULATION_INTERVAL_MS, TimeUnit.MILLISECONDS)
    }
  }


下一篇将介绍Spark源码解读之RDD构建和转换


SparkContext源码解读 SparkContext是Spark的入口,负责连接Spark集群,创建RDD,累积量和广播量等,向集群申请资源与分配任务并监控任务的状态与执行情况。在Yarn-Cluster 模式中Spark任务运行的的整体流程为: Spark客户端向Yarn集群提交应用程序。 ResourceManager 收到请求后,在集群中选择一个 NodeManager,并为该应用程序分配一个 Container,在... 阅读详情

相关推荐

DSP28335笔记——内部Flash中进行数据读写(Flash_API的使用)

Program时的报错返回值较为常见,对返回值30、31进行详解:返回值为30:每次操作写入16位的字节,直到Buffer中的数据全部写入,若写入的数据位超过16位时则返回值30。返回值为31:表示尝试将已有数据位上的0写成1。一般情况下,在Program操作之前,会将指定部分中的数据进行擦除;但擦除函数执行时间较久,且只能以扇区为单位进行擦除,因此也可以在已有数据的基础上再进行Program,但无法将已有数据的位中的0值写成1。

m0_46621336的博客 8749

java hadoop context_Java JavaSparkContext.hadoopConfiguration方法代碼示例

import org.apache.spark.api.java.JavaSparkContext; //導入方法依賴的package包/類public synchronized void start() { // 加鎖,單線程執行String id = getID();if (id != null) {log.info("Starting Batch Layer {}", id);}stream...

weixin_42443651的博客 534

MRI多序列,多中心数据集预处理--使用FSL-Flirt 配准数据

FLIRT(FMRIB 的线性图像配准工具)是用于线性(仿射)模态内和模态间脑图像配准的全自动稳健且准确的工具。 什么是配准 在这两张图片上,很容易看出它们没有对齐,左边相对右边倾斜,虽然我们人类视觉系统还是能把对应的解剖关系连系在一起,但是我们使用计算机分析时确不能够 因此,我们希望相同的解剖结构对齐,用坐标表示的话,希望他们在相同的坐标上。如下图 对齐这些解剖结构的过程就叫做配准(register) 因此,配准的目的也是使相同的解剖结构在同一个位置,便于分析。可以将CT和MRI配准,看同一结构在两个

Tina姐的博客 1万+

SparkContext can only be used on the driver, not in code that it run on workers.

SparkContext can only be used on the driver, not in code that it run on workers. sc不能序列化

weixin_46168298的博客 828

基于STM32L4XX、HAL库的BQ25713RSNR充电芯片驱动程序设计

define BQ25713_I2C_ADDR (0x6B << 1) // 7位地址为 0x6B,HAL库需要左移一位。// 示例:配置 CHARGE_OPTION_0 寄存器:使能充电,使能 ICO(输入电流优化)reg_data |= (EN_CHG_MASK | EN_ICO_MASK);

zhusl6688的博客 406

【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED

本文为使用 STM32Cube IDE 的 STM32 Blue Pill 入门教程。 在本文中,我们将介绍如何控制 STM32 Blue Pill 的 GPIO 引脚。以及开发环境搭建。 本系列文章将重点介绍采用 ARM Cortex-M 的 BluepellSTM32F103C8 微控制器以及如何使用 STM32CubeIDE 对其进行编程。 STM32CubeIDE是STM32官网提供的IDE

视觉与物联智能 1067

项目小笔记

Scala之集合上常见的函数式风格的操作汇总 https://blog.youkuaiyun.com/bluishglc/article/details/53320654   flume官网 http://flume.apache.org/FlumeUserGuide.html   spark在线分析 基本配置 import java.time.LocalDateTime import jav...

ZF98095的博客 237

算法 | 植物根茎生长优化算法(PRGO)原理、公式及应用,matlab代码(2025最强优化算法)

【代码】算法 | 植物根茎生长优化算法(PRGO)原理、公式及应用,matlab代码(2025最强优化算法)

尘世冰封的专栏 1015

SparkContext的初始化

SparkDriver 用于提交用户的应用程序, 一、SparkConf 负责SparkContext的配置参数加载, 主要通过ConcurrentHashMap来维护各种spark.*的配置属性 class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable { import ...

chbxw 1219

Fluent验证案例03:管道中湍流流动压降计算——采用kw-sst模型计算压降更为准确。

阅读(4053) 评论(0)本案例利用Fluent计算管道中湍流流动压降。

qq_15963745的博客 874

手把手教你学Simulink——基于经典滤波器设计的场景:低通滤波器(LPF)的设计与频率响应仿真

滤波器是信号处理领域中非常重要的组件,用于去除不需要的频率成分或者提取有用的频率信息。低通滤波器(Low-Pass Filter, LPF)允许低于某个特定截止频率的信号通过,同时衰减高于该截止频率的信号。在本教程中,我们将学习如何使用设计一个简单的模拟低通滤波器,并对其频率响应进行仿真分析。本文介绍了如何使用设计一个简单的模拟低通滤波器,并通过仿真展示了其应用效果。通过这样的实践,您不仅能够加深对滤波器工作原理的理解,还能掌握利用Simulink进行滤波器设计与仿真的基本技能。

MHD0815的博客 5719

Spark源码-任务提交流程之-6-sparkContext初始化

spark源码阅读、算子

m0_37817767的博客 1197

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Spark源码解读系列--SparkContext的初始化(1)

Spark源码解读系列主要是基于《深入理解Spark--核心思想与源码分析》这本书的,另外加上我个人的补充,由于自己也是Spark的初学者,所以暂时不能解读源码背后的设计思想,只能结合书来解读源码的逻辑和功能。 SparkContext的初始化是Driver应用程序提交执行的前提,以下内容将会以local模式,代码顺序进行讲解。 SparkConf SparkContext的配置参数是由...

Yangyan200707的博客 178

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spark详解(七):SparkContext源码分析以及整体作业提交流程

1. SparkContext源码分析 在任何Spark程序中,必须要创建一个SparkContext,在SparkContext中,最主要的就是创建了TaskScheduler和DAGScheduler,以及SparkUI ... // Create and start the scheduler val (sched, ts) = SparkContext.createTaskSchedule...

Master-TJ的个人博客 498

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spark Core源码解析29连击

《Spark源码精度计划1|SparkConf》《SparkCore源码精读计划2|SparkContext组件初始化》《SparkCore源码精读计划3|...

微信搜:import_bigdata,大数据领域硬核原创作者 396

SparkContext 初始化内部原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34348111的博客 221

pyspark源码之SparkContext学习(context.py)

本系列文章是下载的是spark2.2.1版本的源码进行相关分析和学习。# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additi

xiaoQL520的博客 5349

Spark的Sate划分源码剖析

Spark的Sate划分源码剖析 1.主程序Driver program 需要初始化SparkContext 2.在初始化时会创建三个重量级的类 ​ 1.创建schedulerBacked 负责连接后端计算资源 ​ 2.创建taskScheduler 负责阶段任务调度 ​ 3.创建DAGScheduler 负责阶段划分 // Create and start the scheduler //初始...

Java学习笔记 416

Spark job分配流程源码分析

job提交大体执行流程图: SparkContext : scheduler创建 // Create and start the scheduler ...

211

Spark架构师3-源码

1、上次总结 0:18:00~ 0:41:00 1、Spark RPC(Endpoint:DriverEndpoint ClientEndpoint) 2、利用 akka(endpoint类似于actor) 模拟实现 YARN(Flink 就是基于 akka实现的 RPC) 3、Spark Standalone 集群启动脚本start-all.sh 分析 4、Master 启动分析 5、Wor...

肥猫64的博客 236

《深入理解SPARK:核心思想与源码分析》(前言及第1章)

自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的《深入理解Spark:核心思想与源码分析》一书现在已经正式出版上市,目前亚马逊、京东、当当、天猫等网站均有销售,欢迎感兴趣的同学购买。我开始研究源码时的Spark版本是1.2.0,经过7个多月的研究和出版社近4个月的流程,Spark自身的版本迭代也很快,如今最新已经是1.6.0。目前市面上另外2本源码研究的Spark书籍

何成俭的博客 1206

【源码解读】|SparkContext源码解读

本文针对于SparkContext 初始化总线,来阐述了Spark接收到任务时的一系列操作,让读者可以随时溯源

857技术社区 2707

Spark 源码分析(三): SparkContext 初始化之 TaskScheduler 创建与启动

前面已经分析到了 driver 进程成功在某台 worker 上启动了,下面就开始执行我们写的那些代码了。以一个 wordcount 程序为例,代码如下: val conf = new SparkConf() .setAppName("WordCount") .setMaster("local") val sc = new SparkContext(conf) ...

朱磊的博客 1093

【Spark内核源码】SparkContext一些方法的解读

目录 创建SchedulerBackend的TaskScheduler方法 设置并启动事件总线 发布环境更新的方法 发布应用程序系统的方法 在【Spark内核源码】SparkContext中的组件和初始化 已经介绍了Spark初始化时是如何执行的,都创建了哪些组件。这些组件具体技术细节后面会慢慢的说,而针对SparkContext,里面还有一些方法,值得大家品一品。 创建Schedul...

lazy_moon的博客 918
上一篇: Spark源码解读之RDD依赖Dependency
下一篇: Spark源码解读之RDD构建和转换过程
Wang_AI
博客等级 码龄12年 988粉丝 162原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值