【原】SparkContex源码解读(一)
版权声明:本文为原创文章,未经允许不得转载。
SparkContext(简称sc)是Spark程序的主入口,代表一个连接到Spark集群(Standalone、YARN、Mesos三种集群部署模式)的连接,能被用来在集群上创建RDDs、计数器(accumulators)和广播(broadcast)变量等。一旦和集群连接,sc首先得到集群中节点的executor信息,然后把app代码(jar形式或python文件)发送给executors,最后把job细分后的tasks派发给具体的executor执行。

Spark集群架构图
1.属性
(1)Spark异步事件监听器总线,可以理解为监听器的管家
private[spark] val listenerBus = new LiveListenerBus
(2)两个map集合,用于存储为每个静态文件和jar存放对应的URL和本地时间戳
private[spark] val addedFiles = HashMap[String, Long]
private[spark] val addedJars = HashMap[String, Long]
(3)用一个弱引用类型的Map,记录所有的持久化的RDDs,若值被gc后,那么引用将为null,每当插入N个元素后,就会从Map移除引用为空的entry
private[spark] val persistentRdds = new TimeStampedWeakValueHashMap[Int, RDD[_]]
(4)根据sparkconf、isLocal、监听总线创建Spark运行环境
private var _env: SparkEnv = createSparkEnv(_conf, isLocal, listenerBus)
(5)构造SparkContext的元数据清理器,使用了Timer周期性地清理日志信息,元数据类型不同,清理周期也可能不同
private var _metadataCleaner: MetadataCleaner = new MetadataCleaner(MetadataCleanerType.SPARK_CONTEXT, this.cleanup, _conf)
(6)默认executor的执行内存为1024M
private var _executorMemory: Int = _conf.getOption("spark.executor.memory")
.orElse(Option(System.getenv("SPARK_EXECUTOR_MEMORY")))
.orElse(Option(System.getenv("SPARK_MEM"))
.map(warnSparkMem))
.map(Utils.memoryStringToMb)
.getOrElse(1024)
(7)一个Spark application唯一的主键,它的形式取决于调度的实现,例如本地模式为'local-1433865536131'、YARN模式为 'application_1433865536131_34483'
private var _applicationId: String = _
(8)DAG调度器,把job根据shuffle边界划分为TaskSets
@volatile private var _dagScheduler: DAGScheduler = _
(9)Task调度器,目前只有一个实现子类TaskSchedulerImpl,负责接受从DAG调度器生成的TaskSets然后把他们分配到executor中执行,而TaskSetManager负责TaskSet的调度
private var _taskScheduler: TaskScheduler = _
(10)一个后端的调度接口,用于不同集群模式的调度
private var _schedulerBackend: SchedulerBackend = _
(11)设置一个心跳接收器,driver接受executor的心跳
private var _heartbeatReceiver: RpcEndpointRef = _
(12)JobProgressListener 用于处理Job及Stage相关的事件监听器
private var _jobProgressListener: JobProgressListener = _
2.方法
构造方法有8个,比较简单就不介绍了。
2.1.创建RDD的方法如下所示:

创建RDD的方法总览
方法对应生成的RDD类型有:BinaryFileRDD、BlockRDD、CartesianRDD、CheckpointRDD、CoalescedRDD、CoGroupedRDD、EmptyRDD、HadoopRDD、LocalCheckpointRDD、MapPartitionsRDD、MapPartitionsWithPrepationRDD、NewHadoopRDD、ParallelCollectionRDD、ParititionerAwareUnionRDD、PartitionPruningRDD、PartitionwiseSampledRDD、PipeRDD、SampleRDD、ShuffleRDD、SubstractedRDD、UnionRDD、ZippedPartitionsRDD、ZippedWithIndexRDD,如此多的的RDD,可见RDD的重要性。
2.2.创建计数器(accumulators)的方法如下所示:

创建计数器的方法总览
2.3.创建广播(broadcast)变量的方法就一个:
def broadcast[T: ClassTag](value: T): Broadcast[T] = {
2.4.Spark程序程序job的运行是通过actions算子触发的,action算子如下所示:

action算子总览
每一个action算子其实是一个runJob方法的运行,job的运行是将JobSubmitted事件添加到DAGScheduler中的事件执行队列中,并用JobWaiter等待结果的返回。runJob方法如下所示:

runjob方法总览
5.SparkContext如何在三种部署模式Standalone、YARN、Mesos下实现任务的调度
SparkContext中有一句关键性的代码:
//根据master(masterURL)及SparkContext对象创建TaskScheduler,返回SchedulerBackend及TaskScheduler
val (sched, ts) = SparkContext.createTaskScheduler(this, master)
考虑到篇幅的长度,方法createTaskScheduler的实现下一篇再介绍。
【原】SparkContex源码解读(一)的更多相关文章
- 【原】SparkContex源码解读(二)
版权声明:本文为原创文章,未经允许不得转载. 继续前一篇的内容.前一篇内容为: SparkContex源码解读(一)http://www.cnblogs.com/yourarebest/p/53266 ...
- 【原】Spark中Job的提交源码解读
版权声明:本文为原创文章,未经允许不得转载. Spark程序程序job的运行是通过actions算子触发的,每一个action算子其实是一个runJob方法的运行,详见文章 SparkContex源码 ...
- 【原】Spark不同运行模式下资源分配源码解读
版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Task的提交源码解读 http://www.cnblogs.com/yourarebest/p/5423906.html Sch ...
- SDWebImage源码解读_之SDWebImageDecoder
第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...
- underscore 源码解读之 bind 方法的实现
自从进入七月以来,我的 underscore 源码解读系列 更新缓慢,再这样下去,今年更完的目标似乎要落空,赶紧写一篇压压惊. 前文 跟大家简单介绍了下 ES5 中的 bind 方法以及使用场景(没读 ...
- Alamofire源码解读系列(四)之参数编码(ParameterEncoding)
本篇讲解参数编码的内容 前言 我们在开发中发的每一个请求都是通过URLRequest来进行封装的,可以通过一个URL生成URLRequest.那么如果我有一个参数字典,这个参数字典又是如何从客户端传递 ...
- nodeJS之eventproxy源码解读
1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...
- AbstractQueuedSynchronizer源码解读
1. 背景 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是Doug Lea大师创作的用来构建锁或者其他同步组件(信号量.事件等) ...
- swoft 源码解读【转】
官网: https://www.swoft.org/ 源码解读: http://naotu.baidu.com/file/814e81c9781b733e04218ac7a0494e2a?toke ...
随机推荐
- gentoo装X服务器时显卡选择
前面装X服务器一直装不成功,每个步骤都按hand book上的进行,编译完成后,重启就是启动不了X服务器,最终才知道由于我是用的是 开源显卡nvidia,换成集成显卡inter后X启动成功,顺便说句, ...
- SGU 194 Reactor Cooling Dinic求解 无源无汇有上下界的可行流
题目链接 题意:有向图中有n(1 <= n <= 200)个点,无自环或者环的节点个数至少为3.给定每条边的最小流量和最大流量,问每条边的可行流量为多少? 思路:一般求解的网络流并不考虑下 ...
- C++ 输入输出文件流(ifstream&ofstream)
ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O, ...
- HBASE的安装
HBASE的安装: 安装的软件版本:hbase-0.98.4-hadoop2.tar.gz 下载链接:http://www.apache.org/dist/hbase/hbase-0.98.4/ 1. ...
- vm安装ubuntu桥接模式无法联网
桥接模式,就是和主机不同的ip,其他都是一样的. 编辑网络连接 查看自己机子的ip ipconfig 一般情况下是 ip 192.168.1.XXX 子网掩码 255.255.255.0 网关 192 ...
- hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memo ...
- hdu 4286
splay 练手用: 杭电的oj要手动开栈: #include<cstdio> #pragma comment(linker, "/STACK:102400000,1024000 ...
- codeforces 390D Inna and Sweet Matrix
几个小结论: 1.路径长度=i+j-1; 2.最简单的走法是先横走再竖着走或者先竖着走再横着走 #include<cstdio> #include<cstring> using ...
- 自定义 Lint 规则简介
上个月,笔者在巴黎 Droidcon 的 BarCamp 研讨会上聆听了 Matthew Compton 关于编写自己的 Lint 规则的讲话.深受启发之后,笔者想就此话题做进一步的探索. 定义 如果 ...
- PYTHON的CGIServer的进化
按例程,一步一步理解如何从SOCKET,TCP,HTTP,CGIHTTP进化的. 最终,静态文件和脚本分享,且能处理FORM提交和展示. 下一步,到数据库??:) A,SOCKET #HTTPserv ...