本篇文章就要根据源码分析SparkContext所做的一些事情,用过Spark的开发者都知道SparkContext是编写Spark程序用到的第一个类,足以说明SparkContext的重要性;这里先摘抄SparkContext源码注释来 简单介绍介绍SparkContext,注释的第一句话就是说SparkContext为Spark的主要入口点,简明扼要,如把Spark集群当作服务端那Spark Driver就是客户端,SparkContext则是客户端的核心;如注释所说 SparkContext用于连接Spark集群、创建RDD、累加器(accumlator)、广播变量(broadcast variables),所以说SparkContext为Spark程序的根本都不为过,这里使用的Spark版本为2.0.1;

  图片来自Spark官网,可以看到SparkContext处于DriverProgram核心位置,所有与Cluster、Worker Node交互的操作都需要SparkContext来完成;

SparkContext相关组件

  1、SparkConf
  SparkConf为Spark配置类,配置已键值对形式存储,封装了一个ConcurrentHashMap类实例settings用于存储Spark的配置信息;配置项包括:master、appName、Jars、ExecutorEnv等等;
  2、SparkEnv
  SparkEnv可以说是Context中非常重要的类,它维护着Spark的执行环境,包含有:serializer、RpcEnv、block Manager、map output tracker、etc等;所有的线程都可以通过SparkCotext访问到同一个SparkEnv对象;SparkContext通过SparkEnv.createDriverEnv创建SparkEnv实例;在SparkEnv中包含了如下主要对象:

  SecurityManager:用于对权限、账号进行管理、Hadoop YARN模式下的证书管理等;
  RpcEnv:为Rpc环境的封装,之前使用的是Akka现在默认已经使用了Netty作为Spark的Rpc通信框架,Spark中有RpcEnvFactory trait特质默认实现为NettyRpcEnvFactory,在Factory中默认使用了Jdk的Serializer作为序列化工具;
  SerializerManager:用于管理Spark组件的压缩与序列化;
  BroadcastManager:用与管理广播对象,默认使用了TorrentBroadcastFactory广播工厂;
  MapOutputTracker:跟踪Map阶段结果的输出状态,用于在reduce阶段获取地址与输出结果,如果当前为Driver则创建MapOutputTrackerMaster对象否则创建的是MapOutputTrackerWorker两者都继承了MapOutputTracker类;
  ShuffleManager:用于管理远程和本地Block数据shuffle操作,默认使用了SortShuffleManager实例;
  MemoryManager:用于管理Spark的内存使用策略,有两种模式StaticMemoryManager、UnifiedMemoryManager,第一种为1.6版本之前的后面那张为1.6版本时引入的,当前模式使用第二种模式;两种模式区别为粗略解释为第一种是静态管理模式,而第二种为动态分配模式,execution与storage之间可以相互“借”内存;
  BlockTransferService:块传输服务,默认使用了Netty的实现,用于获取网络节点的Block或者上传当前结点的Block到网络节点;
  BlockManagerMaster:用于对Block的协调与管理;
  BlockManager:为Spark存储系统重要组成部分,用于管理Block;
  MetricsSystem:Spark测量系统;

  3、LiveListenerBus
  异步传递Spark事件监听与SparkListeners监听器的注册;
  4、JobProgressListener
  JobProgressListener监听器用于监听Spark中任务的进度信息,SparkUI上的任务数据既是该监听器提供的,监听的事件包括有,Job:active、completed、failed;Stage:pending、active、completed、skipped、failed等;JobProgressListener最终将注册到LiveListenerBus中;

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

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

  7、DAGScheduler
  DAGScheduler为高级的、基于stage的调度器,为提交给它的job计算stage,将stage作为tasksets提交给底层调度器TaskScheduler执行;DAGScheduler还会决定着stage的最优运行位置;
  8、ExecutorAllocationManager
  根据负载动态的分配与删除Executor,可通过ExecutorAllcationManager设置动态分配最小Executor、最大Executor、初始Executor数量等配置,调用start方法时会将ExecutorAllocationListener加入到LiveListenerBus中监听Executor的添加、移除等;
  9、ContextClearner
  ContextClearner为RDD、shuffle、broadcast状态的异步清理器,清理超出应用范围的RDD、ShuffleDependency、Broadcast对象;清理操作由ContextClearner启动的守护线程执行;
  10、SparkStatusTracker
  低级别的状态报告API,对job、stage的状态进行监控;包含有一个jobProgressListener监听器,用于获取监控到的job、stage事件信息、Executor信息;
  11、HadoopConfiguration
  Spark默认使用HDFS来作为分布式文件系统,HadoopConfigguration用于获取Hadoop配置信息,通过SparkHadoopUtil.get.newConfiguration创建Configuration对象,SparkHadoopUtil 会根据SPARK_YARN_MODE配置来判断是用SparkHadoopUtil或是YarnSparkHadoopUtil,创建该对象时会将spark.hadoop.开头配置都复制到HadoopConfugration中;

简单总结

  以上的对象为SparkContext使用到的主要对象,可以看到SparkContext包含了Spark程序用到的几乎所有核心对象可见SparkContext的重要性;创建SparkContext时会添加一个钩子到ShutdownHookManager中用于在Spark程序关闭时对上述对象进行清理,在创建RDD等操作也会判断SparkContext是否已stop;
  通常情况下一个Driver只会有一个SparkContext实例,但可通过spark.driver.allowMultipleContexts配置来允许driver中存在多个SparkContext实例;

参考资料:
http://spark.apache.org/docs/latest/

文章首发地址:Solinx
http://www.solinx.co/archives/643

Spark——SparkContext简单分析的更多相关文章

  1. Spark源码分析 – SparkContext

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

  2. spark 源码分析之二 -- SparkContext 的初始化过程

    创建或使用现有Session 从Spark 2.0 开始,引入了 SparkSession的概念,创建或使用已有的session 代码如下: val spark = SparkSession .bui ...

  3. 【转】Spark源码分析之-deploy模块

    原文地址:http://jerryshao.me/architecture/2013/04/30/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B- ...

  4. Spark源码分析之Checkpoint的过程

    概述 checkpoint 的机制保证了需要访问重复数据的应用 Spark 的DAG执行图可能很庞大,task 中计算链可能会很长,这时如果 task 中途运行出错,那么 task 的整个需要重算非常 ...

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

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

  6. Spark 源码分析 -- task实际执行过程

    Spark源码分析 – SparkContext 中的例子, 只分析到sc.runJob 那么最终是怎么执行的? 通过DAGScheduler切分成Stage, 封装成taskset, 提交给Task ...

  7. Spark源码分析 – DAGScheduler

    DAGScheduler的架构其实非常简单, 1. eventQueue, 所有需要DAGScheduler处理的事情都需要往eventQueue中发送event 2. eventLoop Threa ...

  8. Spark源码分析 -- PairRDD

    和一般RDD最大的不同就是有两个泛型参数, [K, V]表示pair的概念 关键的function是, combineByKey, 所有pair相关操作的抽象 combine是这样的操作, Turns ...

  9. Spark源码分析之八:Task运行(二)

    在<Spark源码分析之七:Task运行(一)>一文中,我们详细叙述了Task运行的整体流程,最终Task被传输到Executor上,启动一个对应的TaskRunner线程,并且在线程池中 ...

随机推荐

  1. vagrant 1.8.6 安装过程及总结遇到的坑

    下面先总结遇到的问题,这些问题如果你也遇到,可能需要搜索很多次才能找到原因. 如果想看安装过程,可以先直接跳到后面第二部分部分. 1 问题汇总: 1.1 vagrant版本过高问题. vagrant ...

  2. 创建Github远程仓库

    如何创建github远程仓库 首先, 你有先到github网站注册账号https://github.com 然后创建一个项目, Create a new repository 之后在在Reposito ...

  3. python code

    执行动态语句 执行字符串中的代码 http://www.cnblogs.com/fanweibin/p/5418817.html #!usr/bin/env python #coding:utf-8 ...

  4. 1. SVM简介

    从这一部分开始,将陆续介绍SVM的相关知识,主要是整理以前学习的一些笔记内容,梳理思路,形成一套SVM的学习体系. 支持向量机(Support Vector Machine)是Cortes和Vapni ...

  5. 你可能不知道的陷阱, IEnumerable接口

    1.  IEnumerable 与  IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...

  6. [C#] 走进异步编程的世界 - 剖析异步方法(上)

    走进异步编程的世界 - 剖析异步方法(上) 序 这是上篇<走进异步编程的世界 - 开始接触 async/await 异步编程>(入门)的第二章内容,主要是与大家共同深入探讨下异步方法. 本 ...

  7. Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全 (转)

    目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实 ...

  8. Vertica集群单节点宕机恢复方法

    Vertica集群单节点宕机恢复方法 第一种方法: 直接通过admintools -> 5 Restart Vertica on Host 第二种方法: 若第一种方法无法恢复,则清空宕机节点的c ...

  9. CSS 基础篇、绝对有你想要

    本章内容: 简介 CSS 定义 四种引入方式 样式应用的顺序 选择器(Selector) * 通用元素选择器 标签选择器 class 类选择器 # ID选择器 , 多元素选择器 后代元素选择器 > ...

  10. FFmpeg学习1:视频解码

    在视频解码前,先了解以下几个基本的概念: 编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分. 容器/多媒体文件(Container/File):没有了解 ...