spark[源码]-sparkContext详解[一]
spark简述
sparkContext在Spark应用程序的执行过程中起着主导作用,它负责与程序和spark集群进行交互,包括申请集群资源、创建RDD、accumulators及广播变量等。sparkContext与集群资源管理器、work节点交互图如下:

官网对图下面几点说明:
(1)不同的Spark应用程序对应该不同的Executor,这些Executor在整个应用程序执行期间都存在并且Executor中可以采用多线程的方式执行Task。这样做的好处是,各个Spark应用程序的执行是相互隔离的。除Spark应用程序向外部存储系统写数据进行数据交互这种方式外,各Spark应用程序间无法进行数据共享。
(2)Spark对于其使用的集群资源管理器没有感知能力,只要它能对Executor进行申请并通信即可。这意味着不管使用哪种资源管理器,其执行流程都是不变的。这样Spark可以不同的资源管理器进行交互。
(3)Spark应用程序在整个执行过程中要与Executors进行来回通信。
(4)Driver端负责Spark应用程序任务的调度,因此最好Driver应该靠近Worker节点。
1.源码鉴赏-综述
在spark程序运行起来后,程序就会创建sparkContext,解析用户的代码,当遇到action算的时候开始执行程序,但是在执行之前还有很多前提工作要在sparkContext中做的,请记住你要了解了sparkContext,你就了解了spark。

- sparkContext构建的顶级三大核心:DAGScheduler,TaskScheduler,SchedulerBackend.
- DAGScheduler是面向Job的Stage的高层调度器。
- TaskScheduler是一个接口,是低层调度器,根据具体的ClusterManager的不同会有不同的实现。Standalone模式下具体实现的是TaskSchedulerlmpl。
- SchedulerBackend是一个接口,根据具体的ClusterManger的不同会有不同的实现,Standalone模式下具体的实现是SparkDeloySchedulerBackend。
- 从整个程序运行的角度来讲,sparkContext包含四大核心对象:DAGScheduler,TaskScheduler,SchedulerBackend,MapOutputTrackerMaster。
- SparkDeploySchedulerBackend有三大核心功能:
- 负责接收Master接受注册当前程序RegisterWithMaster。
- 接受集群中为当前应用程序而分配的计算资源Executor的注册并管理Executor。
- 负责发送Task到具体的Executor执行。
- SparkDeploySchedulerBackend是被TaskSchedulerlmpl管理的。
sparkContext变量初始化
创建sparkContext的时候会做很多初始化事情,初始化很多变量。

事件监控总线:private[spark] val listenerBus = new LiveListenerBus
第一个重要的初始化出来了:这个地方是创建sparkEnv,就是创建actor,根据判断创建dirver-actor

sparkContext的三大核心:这个只是一个定义getter和setter的方法,scala和java是有区别的,可以看看语法。但请时刻技术这三个核心。

从try开始了真正意义上的初始化操作了:396行。
_conf = config.clone():复制一个conf
_conf.validateSettings():检查一些关键配置和是否存在,一些默认配置如果不存在,添加默认设置参数。
_conf.set("spark.executor.id", SparkContext.DRIVER_IDENTIFIER):请注意这个,其实在spark眼里没有driver的概念,都是Executor,只是id标签标记为了driver而已。
sparkEnv初始化:http://www.cnblogs.com/chushiyaoyue/p/7472904.html下面是三大核心的创建:

创建createTaskScheduler:根据master的运行情况创建:

这个地方用到了正则匹配来判断master的模式,我们以standalone的模式来讲解:

根据模式匹配:TaskSchedulerImpl 创建,注意集群模式默认重试4次,本地模式只尝试1次。

可以自己观察一下其他模式的创建情况,但是会发现TaskSchedulerlmpl基本上是一样。具体的TaskSchedulerImpl的实例创建和initialize()请参看另一篇文章。
http://www.cnblogs.com/chushiyaoyue/p/7475013.html
new TaskSchedulerImpl(sc):主要的是初始化一些变量。
scheduler.initialize(backend):创建资源配置池和资源调度算法,同时通过SchdulableBuilder.addTaskSetmanager:SchdulableBuilder会确定TaskSetManager的调度顺序,然后按照TaskSetManager来确定每个Task具体运行在哪个ExecutorBackend中。
创建_dagScheduler = new DAGScheduler(this)
启动taskScheduler

在这个方法中再调用 backend (SparkDeploySchedulerBackend) 的 start( ) 方法。

这个地方先启动super.start()方法,在这个类CoarseGrainedSchedulerBackend里面。

这个方法主要是实例化DriverEndpoint,DriverEndpoint是整个集群内部和应用程序交互的关键。
时刻记住RpcEndpoint的声明周期==constructor -> onStart -> receive* -> onStop
当实例化完成以后调用onStart方法

DriverEndpoint在实例化的时候根据Spark的RPC的消息工作机制会调用生命周期方法onStart方法,在该方法执行时会执行Option(self).foreach(_.send(ReviveOffers))来周期性地发ReviveOffers消息给自己,ReviveOffers是个空的object,会触发makeOffers来‘Make fake resource offers on all executors’。
开始创建的时候是发送的空的,这是在等待执行具体的task的时候用的。
注册app到master

通过SparkDeploySchedulerBackend 注册到Master 的时候会将以上的 command 提交给 Master ,请注意org.apache.spark.executor.CoarseGrainedExecutorBackend,将来会通过这个启动启动执行的executor。
master发指令给worker去启动Executor所有的进程的时候加载的main方法所在的入口类就是coommand中的CoarseGrainedExecutorBackend,当然你可以实现自己的ExecutorBackend,在CoarseGrainnedExecutorBackend中启动Executor(Executor是先注册在实例化),Executor通过线程值并发执行Task。
整体上的内容大概是这样的启动过程,其中存在很多具体的细节,在后续的文章中在详细介绍吧。
spark[源码]-sparkContext详解[一]的更多相关文章
- NopCommerce源码架构详解--初识高性能的开源商城系统cms
很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...
- NopCommerce源码架构详解
NopCommerce源码架构详解--初识高性能的开源商城系统cms 很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从 ...
- Nop--NopCommerce源码架构详解专题目录
最近在研究外国优秀的ASP.NET mvc电子商务网站系统NopCommerce源码架构.这个系统无论是代码组织结构.思想及分层都值得我们学习.对于没有一定开发经验的人要完全搞懂这个源码还是有一定的难 ...
- Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览
一.设计原理 1.Hadoop架构: 流水线(PipeLine) 2.Hadoop架构: HDFS中数据块的状态及其切换过程,GS与BGS 3.Hadoop架构: 关于Recovery (Lease ...
- Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立
该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 关于RPC(Remote Procedure Call),如果没有概念,可以参考一下RMI(Remot ...
- Hadoop3.1.1源码Client详解 : 入队前数据写入
该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 紧接着上一篇: Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立 先给出 ...
- Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之DataStreamer(Packet发送) : 主干
该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 在上一章(Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立) 我们提到, ...
- Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之ResponseProcessor(ACK接收)
该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 紧接着上一篇文章: Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之D ...
- spark[源码]-sparkContext概述
SparkContext概述 sparkContext是所有的spark应用程序的发动机引擎,就是说你想要运行spark程序就必须创建一个,不然就没的玩了.sparkContext负责初始化很多东西, ...
随机推荐
- ionic触摸事件
官方文档:http://ionicframework.com/docs/api/directive/onHold/ on-hold 长按事件on-tap 点击事件 on-double-tap 双击事 ...
- Delphi 编译/链接过程
- hdu4525
可以发现天的操作相当于*(k1+k2) 然后就很好判断了. 威威猫系列故事——吃鸡腿 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 6 ...
- oracle 存储过程返回结果集
好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...
- XStream中几个注解的含义和用法
转自:http://blog.csdn.net/robert_mm/article/details/8459879 XStream是个很强大的工具,能将java对象和xml之间相互转化.xstream ...
- 探讨Java I/O类和接口
(输出)Output:程序---->数据源(如某个文件) (输入)Input:数据源---->程序 Java.io定义的I/O类如下表所示: BufferedInputStream Buf ...
- 参数估计(1):从最小二乘到最小b乘
机器学习到底学习到了什么,或者说“训练”步骤到底在做些什么?在我看来答案无非是:所谓的“学习”就是把大量的数据归纳到少数的参数中,“训练”正是估计这些参数的过程.所以,除了“参数估计”, 我想不到还有 ...
- MySQL - 查询今天的数据(以及昨天、本月、上个月、今年...) 查询Datetime 时间的数据
1,查询当天(今天)的数据 1 SELECT * FROM `order` WHERE TO_DAYS(order_time) = TO_DAYS(NOW()) 2,查询昨天的数据 1 SELECT ...
- 类的super
我们经常在类的继承当中使用super(), 来调用父类中的方法.例如下面: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A: def func(self): ...
- 大量高清文字版PDF编程书籍下载
下载地址 :http://zhaojucai.com/download.html 文件夹: 数学之美(第二版) Java编程思想(第4版) 图灵程序设计丛书:Python基础教程(第2版)(修订版) ...