版权声明:本文为原创文章,未经允许不得转载。

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源码解读(一)的更多相关文章

  1. 【原】SparkContex源码解读(二)

    版权声明:本文为原创文章,未经允许不得转载. 继续前一篇的内容.前一篇内容为: SparkContex源码解读(一)http://www.cnblogs.com/yourarebest/p/53266 ...

  2. 【原】Spark中Job的提交源码解读

    版权声明:本文为原创文章,未经允许不得转载. Spark程序程序job的运行是通过actions算子触发的,每一个action算子其实是一个runJob方法的运行,详见文章 SparkContex源码 ...

  3. 【原】Spark不同运行模式下资源分配源码解读

    版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Task的提交源码解读 http://www.cnblogs.com/yourarebest/p/5423906.html Sch ...

  4. SDWebImage源码解读_之SDWebImageDecoder

    第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...

  5. underscore 源码解读之 bind 方法的实现

    自从进入七月以来,我的 underscore 源码解读系列 更新缓慢,再这样下去,今年更完的目标似乎要落空,赶紧写一篇压压惊. 前文 跟大家简单介绍了下 ES5 中的 bind 方法以及使用场景(没读 ...

  6. Alamofire源码解读系列(四)之参数编码(ParameterEncoding)

    本篇讲解参数编码的内容 前言 我们在开发中发的每一个请求都是通过URLRequest来进行封装的,可以通过一个URL生成URLRequest.那么如果我有一个参数字典,这个参数字典又是如何从客户端传递 ...

  7. nodeJS之eventproxy源码解读

    1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...

  8. AbstractQueuedSynchronizer源码解读

    1. 背景 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是Doug Lea大师创作的用来构建锁或者其他同步组件(信号量.事件等) ...

  9. swoft 源码解读【转】

      官网: https://www.swoft.org/ 源码解读: http://naotu.baidu.com/file/814e81c9781b733e04218ac7a0494e2a?toke ...

随机推荐

  1. switch...case 和 if...else

    switch...case与if...else的根本区别在于: switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的,switc ...

  2. CentOS 编译安装Apache2.4.10

    1.准备编译环境 yum -y install gcc make cmake autoconf libtool libevent 安装apache必须的依赖包 yum -y install apr-u ...

  3. CentOS添加RPMforge软件源

    1.查看CentOS版本 cat /etc/redhat-release 2.查看系统位数 uname -i 3.下载rpm包 wget "rpm地址" CentOS 6: i68 ...

  4. Python Socket,How to Create Socket Cilent? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  5. Django路由

    一.路由流程 1. 用户浏览器发出请求后,通过根url设置,去找urlpattern变量.在setting.py中对 ROOT_URLCONF进行配置,以确定根URLconf(URL configur ...

  6. MyEclipse使用自己的JDK和Tomcat

    配置tomcat:window-->preferences-->myeclipse-->servers-->tomcat-->选一个-->右边选择一的tomcat的 ...

  7. 如何避免远程循环执行SSH时,到第一条之后就退出

    RT 今天遇到的小问题,记录下来. 据说关键是加  < /dev/null 我也是看网上别人说的,测试成功. #!/bin/bash while read line do echo $line ...

  8. 练习-libev和pyev示例

    事件循环,IO复用,还是理解深刻一点好. 比较LIBEV和PYEV,发现PYTHON库只是对LIBEV作了简单的语法转换. 到了这个层次,就一个字:DIAO!!! libev的C版: #include ...

  9. 在8086中,[ idata],[bx]表示内存单元时。可能是一个字节,也可能是一个字。

    可能表示一个字节,也可能表示一个字.主要由指令中另一个计算对象决定.如al表示一个字节.ax就表示一个字. 这个区别主要体现在循环中,偏移地址的循环变量是加1还是加2,al是偏移地址加1,ax是偏移地 ...

  10. [Gauss]POJ1222 EXTENDED LIGHTS OUT

    题意:给一个5*6的矩阵 1代表该位置的灯亮着, 0代表该位置的灯没亮 按某个位置的开关,可以同时改变 该位置 以及 该位置上方.下方.左方.右方, 共五个位置的灯的开.关(1->0, 0-&g ...