Spark版本 1.3
SparkContext初始化流程

1.0 在我们的主类 main() 方法中经常会这么写
  val conf = new SparkConf().setAppName("name").setMaster("local")
  val sc = new SparkContext(conf)
  conf 中保存的是Spark的参数
  sc 是我们的Spark上下文...好无聊...
  conf不再去看(里边都是对于参数的操作, 现阶段不看)
  sc 从 SparkContext(config: SparkConf) 开始~

1.1  * 很重要:SparkContext是Spark提交任务到集群的入口
  * 我们看一下SparkContext的主构造器
  * 1.调用 createSparkEnv 方法创建 SparkEnv, 里面有一个非常重要的对象 ActorSystem
  * 2.创建 TaskScheduler -> 根据提交任务的URL进行匹配 -> TaskSchedulerImpl -> SparkDeploySchedulerBackend(里面有两个Actor)
  * 3.创建 DAGScheduler
  * 4.taskScheduler.start()


1.2	private[spark] val env = createSparkEnv(conf, isLocal, listenerBus)
  class SparkContext(config: SparkConf) extends Logging with ExecutorAllocationClient {
// 调用 def createSparkEnv() 方法, 转到:1.4
private[spark] def createSparkEnv(
conf: SparkConf,
isLocal: Boolean,
listenerBus: LiveListenerBus): SparkEnv = {
SparkEnv.createDriverEnv(conf, isLocal, listenerBus)
} //创建一个后端调度器(schedulerBackend) 和 一个任务调度器(taskScheduler), 转到:1.5
private[spark] var (schedulerBackend, taskScheduler) =
SparkContext.createTaskScheduler(this, master) // 通过 ActorSystem 创建了一个Actor,这个心跳是 Executors 和 DriverActor 的心跳
private val heartbeatReceiver = env.actorSystem.actorOf(
Props(new HeartbeatReceiver(taskScheduler)), "HeartbeatReceiver") // 创建了一个DAGScheduler,以后用来把DAG切分成Stage
@volatile private[spark] var dagScheduler: DAGScheduler = _
try{
dagScheduler = new DAGScheduler(this)
}catch{...} // start TaskScheduler after taskScheduler sets DAGScheduler reference in DAGScheduler's constructor
// 在DAG构造函数中为每个TaskScheduler设置DAGScheduler后, 启动taskScheduler(DAG源码分析, 详见后续文章) 转到:1.6
taskScheduler.start()
...
}

  

1.4
// SparkContext.createSparkEnv中调用了 SparkEnv.createDriverEnv
private[spark] def createDriverEnv(
conf: SparkConf,
isLocal: Boolean,
listenerBus: LiveListenerBus,
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 方法 并传入一坨参数
create(
conf,
SparkContext.DRIVER_IDENTIFIER,
hostname,
port,
isDriver = true,
isLocal = isLocal,
listenerBus = listenerBus,
mockOutputCommitCoordinator = mockOutputCommitCoordinator
)
} private def create(
conf: SparkConf,
executorId: String,
hostname: String,
port: Int,
isDriver: Boolean,
isLocal: Boolean,
listenerBus: LiveListenerBus = null,
numUsableCores: Int = 0,
mockOutputCommitCoordinator: Option[OutputCommitCoordinator] = None): SparkEnv = { ... // Create the ActorSystem for Akka and get the port it binds to.
val (actorSystem, boundPort) = {
val actorSystemName = if (isDriver) driverActorSystemName else executorActorSystemName
// 利用AkkaUtils这个工具类创建ActorSystem
AkkaUtils.createActorSystem(actorSystemName, hostname, port, conf, securityManager)
} ... // 最终将创建好的ActorSystem返回给SparkEnv
// 回调步骤 new Spark() -> create() -> SparkEnv.createDriverEnv -> SparkContext.createSparkEnv()
new SparkEnv(
executorId,
actorSystem,
serializer,
closureSerializer,
cacheManager,
mapOutputTracker,
shuffleManager,
broadcastManager,
blockTransferService,
blockManager,
securityManager,
httpFileServer,
sparkFilesDir,
metricsSystem,
shuffleMemoryManager,
outputCommitCoordinator,
conf)
}

  

1.5
//SparkContext.createSparkEnv 中调用了 (schedulerBackend, taskScheduler) = SparkContext.createTaskScheduler(this, master)
/**
* Create a task scheduler based on a given master URL.
* Return a 2-tuple of the scheduler backend and the task scheduler.
*/
// 根据提交任务时指定的URL创建相应的TaskScheduler 关于TaskScheduler 转到:1.7
private def createTaskScheduler(sc: SparkContext,
master: String): (SchedulerBackend, TaskScheduler) = {
//模式匹配
master match {
// spark的StandAlone模式
case SPARK_REGEX(sparkUrl) =>
// 创建了一个TaskSchedulerImpl. 注: TaskScheduler是一个特质
val scheduler = new TaskSchedulerImpl(sc)
val masterUrls = sparkUrl.split(",").map("spark://" + _)
// 创建了一个SparkDeploySchedulerBackend(Spark后端部署调度器)
val backend = new SparkDeploySchedulerBackend(scheduler, sc, masterUrls)
// 调用initialize, 使用Spark后端部署调度器 初始化调度器
scheduler.initialize(backend)
(backend, scheduler)
... // 其他模式
}
}

  





1.6
DAGScheduler 简介

实现面向阶段调度的高级调度层。它计算每个作业的阶段DAG,跟踪哪些RDD和阶段输出具体化,并找到运行作业的最小计划。
然后,它将阶段作为TaskSets提交给在集群上运行它们的底层TaskScheduler实现。

除了提供阶段的DAG之外,此类还根据当前缓存状态确定运行每个任务的首选位置,并将这些位置传递给低级TaskScheduler。
此外,它处理由于shuffle输出文件丢失而导致的故障,在这种情况下可能需要重新提交旧阶段。在一个不是由随机文件丢失引
起的阶段内的故障由TaskScheduler处理,它将在取消整个阶段之前重试每个任务很多次。

以下是制作或查看此课程更改时使用的核对清单:
添加新数据结构时,请更新 `DAGSchedulerSuite.assertDataStructuresEmpty`以包含新结构。这将有助于捕获内存泄漏。



1.7
TaskScheduler简介

低级任务调度程序接口,目前由TaskSchedulerImpl专门实现。

该接口允许插入不同的任务调度程序。 每个TaskScheduler都为单个SparkContext调度任务。

这些调度程序从DAGScheduler为每个阶段获取提交给它们的任务集,并负责将任务发送到集群,
运行它们,如果存在故障则重试,以及减轻落后者。 他们将事件返回给DAGScheduler。

Spark-源码-SparkContext的初始化的更多相关文章

  1. spark[源码]-sparkContext详解[一]

    spark简述 sparkContext在Spark应用程序的执行过程中起着主导作用,它负责与程序和spark集群进行交互,包括申请集群资源.创建RDD.accumulators及广播变量等.spar ...

  2. spark[源码]-sparkContext概述

    SparkContext概述 sparkContext是所有的spark应用程序的发动机引擎,就是说你想要运行spark程序就必须创建一个,不然就没的玩了.sparkContext负责初始化很多东西, ...

  3. Spark源码剖析 - SparkContext的初始化(二)_创建执行环境SparkEnv

    2. 创建执行环境SparkEnv SparkEnv是Spark的执行环境对象,其中包括众多与Executor执行相关的对象.由于在local模式下Driver会创建Executor,local-cl ...

  4. Spark源码剖析 - SparkContext的初始化(三)_创建并初始化Spark UI

    3. 创建并初始化Spark UI 任何系统都需要提供监控功能,用浏览器能访问具有样式及布局并提供丰富监控数据的页面无疑是一种简单.高效的方式.SparkUI就是这样的服务. 在大型分布式系统中,采用 ...

  5. Spark源码分析 – SparkContext

    Spark源码分析之-scheduler模块 这位写的非常好, 让我对Spark的源码分析, 变的轻松了许多 这里自己再梳理一遍 先看一个简单的spark操作, val sc = new SparkC ...

  6. spark源码阅读--SparkContext启动过程

    ##SparkContext启动过程 基于spark 2.1.0  scala 2.11.8 spark源码的体系结构实在是很庞大,从使用spark-submit脚本提交任务,到向yarn申请容器,启 ...

  7. Apache Spark源码剖析

    Apache Spark源码剖析(全面系统介绍Spark源码,提供分析源码的实用技巧和合理的阅读顺序,充分了解Spark的设计思想和运行机理) 许鹏 著   ISBN 978-7-121-25420- ...

  8. 《Apache Spark源码剖析》

    Spark Contributor,Databricks工程师连城,华为大数据平台开发部部长陈亮,网易杭州研究院副院长汪源,TalkingData首席数据科学家张夏天联袂力荐1.本书全面.系统地介绍了 ...

  9. Spark 源码解析:TaskScheduler的任务提交和task最佳位置算法

    上篇文章<  Spark 源码解析 : DAGScheduler中的DAG划分与提交 >介绍了DAGScheduler的Stage划分算法. 本文继续分析Stage被封装成TaskSet, ...

  10. Spark源码分析:多种部署方式之间的区别与联系(转)

    原文链接:Spark源码分析:多种部署方式之间的区别与联系(1) 从官方的文档我们可以知道,Spark的部署方式有很多种:local.Standalone.Mesos.YARN.....不同部署方式的 ...

随机推荐

  1. 【Linux】 静态函数库设计

    一.外部函数来源-- 函数库&系统调用 二.函数库分类 静态函数库 --多份拷贝 动态函数库 --单份拷贝 区别 链接方式区别 三.函数库存放位置 Linux应用程序使用的主要函数库均存放于/ ...

  2. spring@Autowired注入为null的问题,2017年9月14日21点41分记录

    这个小问题纠结了三个小时..发出来留个纪念 这是启动项目的时候 这是请求控制器的时候   图1注入的时候是null,图2请求控制器的时候是有的,这是因为图1debug的地方是构造器..autowire ...

  3. Android学习——ViewPager的使用(三)

    这一节来介绍一下在ViewPager中常用到的一个控件,标题栏. 标题栏分为PagerTabStrip和PagerTitleStrip两种,用法类似,这里介绍第一种. 具体做法 在layout文件中的 ...

  4. 使用mysql5.7新特性解决前通配符查询性能问题

    众所周知,在mysql里的后通配符可以使用索引查找,前通配查询却无法使用到索引,即使是使用到了索引,也是使用了索引全扫描,效率依然不高,再MySQL5.7之前,一直都没有好的办法解决,但是到了MySQ ...

  5. 使用WindowsService为宿主实装WCF 服务

    1. 写WCF服务   创建一个接口类,与一个实现类.接口类上打上[ServiceContract]标签,需要暴露的服务方法上打上[OperationContract] (注意:增加System.Se ...

  6. Linux中如何安装配置Mysql和SVN服务端

    目标Linux系统为centOS 一.安装登陆mysql   1.直接以root用户运行:yum install mysql 和yum install mysql-server等带安装完成. 2.安装 ...

  7. June 10th 2017 Week 23rd Saturday

    A lot of things, we can be touched, but we can not shed tears. 很多事情,我们可以感动,却不能流泪. Sometimes I was to ...

  8. February 24 2017 Week 8 Friday

    If you fail, don't forget to learn your lesson. 如果你失败了,千万别忘了汲取教训. Frankly speaking, it is easy to ta ...

  9. 云盘+Git GUI实现云盘文件版本号控制

    以下介绍操作细节 1.先下载Git GUI 下载地址:http://msysgit.github.io/       再下载百度云网盘 下载地址:http://pan.baidu.com 接下来就是安 ...

  10. 给于用户Agent权限设置

    问题:有一个用户需要有create\alter\drop job人权限.默认是只有sysadmin成员才有这个权限.肯定不能将用户放到这个组 答案:所有JOB都属于msdb库中读取和写入信息.所以,肯 ...