spark源码分析之SparkContext
- 1.SparkContext简介
- 2 初始化SparkContext需要启动的组件
- 3 SparkContext 的其他内部组件
- 3.1 creationSite
- 3.2 allowMultioleContext
- 3.3 startTime
- 3.4 stopped
- 3.5 addedFiles
- 3.6 addedJars
- 3.7 persistentRdds
- 3.8 executorEnvs
- 3.9 sparkUser
- 3.10 checkPointDir
- 3.11 localProperties
- 3.12 _conf
- 3.13 _jars
- 3.14 _files
- 3.15 _eventLogDir
- 3.16 _eventLogCodec
- 3.17 _hadoopConfiguration
- 3.18 _executorMemory
- 3.19 _applicationId
- 3.20 _applicationAttemptId
- 3.21 _listenerBusStarted
- 3.22 nextShuffleID
- 3.23 nextRddID
1.SparkContext简介
- Main entry point for Spark functionality. A SparkContext represents the connection to a Spark
- spark 程序的主入口。sc 表示 和一个spark集群的连接,
- cluster, and can be used to create RDDs, accumulators and broadcast variables on that cluster.
可以用来在这个集群上 创建rdd ,计算和 广播变量。 - Only one SparkContext may be active per JVM. You must
stop()
the active SparkContext before - 每个jvm上只有一个sc 是活跃的。 在创建一个新的sc 之前必须调用 stop 方法来 停掉之前的sc
- creating a new one. This limitation may eventually be removed; see SPARK-2243 for more details.
- 这个限制可能会被移除。
2 初始化SparkContext需要启动的组件
2.0 SparkContext私有的可变成员变量
/* ------------------------------------------------------------------------------------- *
| Private variables. These variables keep the internal state of the context, and are |
| not accessible by the outside world. They're mutable since we want to initialize all |
| of them to some neutral value ahead of time, so that calling "stop()" while the |
| constructor is still running is safe. |
* ------------------------------------------------------------------------------------- */
private var _conf: SparkConf = _
//sparkconf 配置
private var _eventLogDir: Option[URI] = None
private var _eventLogCodec: Option[String] = None
private var _listenerBus: LiveListenerBus = _
private var _env: SparkEnv = _
private var _statusTracker: SparkStatusTracker = _
private var _progressBar: Option[ConsoleProgressBar] = None
private var _ui: Option[SparkUI] = None
private var _hadoopConfiguration: Configuration = _
private var _executorMemory: Int = _
private var _schedulerBackend: SchedulerBackend = _
private var _taskScheduler: TaskScheduler = _
private var _heartbeatReceiver: RpcEndpointRef = _
@volatile private var _dagScheduler: DAGScheduler = _
private var _applicationId: String = _
private var _applicationAttemptId: Option[String] = None
private var _eventLogger: Option[EventLoggingListener] = None
private var _executorAllocationManager: Option[ExecutorAllocationManager] = None
private var _cleaner: Option[ContextCleaner] = None
private var _listenerBusStarted: Boolean = false
private var _jars: Seq[String] = _
private var _files: Seq[String] = _
private var _shutdownHookRef: AnyRef = _
private var _statusStore: AppStatusStore = _
2.1 SpaekEnv
Spark运行时的环境。无论是driver端还是excutor端都依赖于SparkEnv所提供的运行环境。
2.2 LiveListenerBus
SparkContext的事件总线。接受使用方发送的事件。并且通过异步的方式对事件进行匹配后调用SparkListener的不同方法。
2.3 SparkUI
Spark用户界面。SparkUI间接依赖于计算引擎、调度系统、存储体系,job、stage、存储、Executor等组件的监控数据都以SparkListenerEvent的格式投递到LiveListenerBus,SparkUI从SparkListener中读取数据显示到web页面。
2.4 SparkStatusTracker
提供对job、stage的监控信息。低级API,只能提供非常弱的一致性机制。
2.5 ConsoleProgressBar
利用SparkStatusTracker的API,在控制台展示Stage的进度。由于依赖SparkStatusTracker,所以在控制台展示的进度会存在延时。
2.6 DAGScheduler
属于spark的调度系统成员。将application中的RDD按照依赖属性划分到不同的stage,并且提交stage.创建job。
2.7 TaskScheduler
属于Spark的调度系统成员。TaskScheduler按照调度算法对集群管理器已经分配给应用程序的资源进行二次调度后分配给任务。TaskScheduler所调度的task是DAGScheduler创建的。DAGScheduler是TaskScheduler的前置调度。
2.8 HeartbeatReceiver
心跳接受器。所有的Executor会向HeartbeatReceiver发送心跳。HeartbeatReceiver接受心跳之后先更新Executor的最后可见时间,然后将此信息交给TaskScheduler进一步处理。
2.9 ContextCleaner
上下文清理器。使用异步清理的方式,清理超出应用作用域的RDD、ShuffleDependency、和广播的变量broadcast。
2.10 JobProgressListener
作业进度监听器。 会注册到liveListenerBus作为监听器之一使用。
2.11 EventLoggingListener
将事件持久化到存储的 监听器。当spark.eventLog.enabled属性 为true 时开启。
2.12 ExecutorAllocationManager
Executor动态分配管理器。根据工作负载动态调整Executor的数量。配置 spark.dynamicAllocation.enabled 的true前提下,在非local 模式下或 spark.dynamicAllication.testing 为true 时启用。
2.13 ShutdownHookManager
用于设置关闭钩子的管理器。可以给应用设置关闭钩子,这样就可以在 jvm 进程退出时,执行一些清理工作。
3 SparkContext 的其他内部组件
3.1 creationSite
类型:CallSite,保存线程栈中最靠近栈顶的用户定义的类。以及最靠近栈底的scala或spark核心类信息,callSite的shortForm 属性保存以上的简短描述,longForm保存着以上信息的的完整描述。
3.2 allowMultioleContext
是否允许多个SparkContext实例。 参数:spark.allowMultipleContext 控制。
3.3 startTime
SparkContext 启动时间戳。
3.4 stopped
SparkContext 是否已经停止的状态。
3.5 addedFiles
用于每个本地文件的Url与添加此文件的addedFiles时的时间戳之间的的映射缓存。
3.6 addedJars
用于每个本地jar与添加此JAR到addedJars时的时间戳之间的映射缓存。
3.7 persistentRdds
对所有持久化的Rdd保持跟踪。
3.8 executorEnvs
用于存储环境变量。executorEnvs中的环境变量都讲传递给执行任务的 Executor。
3.9 sparkUser
当前系统的登录用户,或者通过SPARK_USER进行设定。
3.10 checkPointDir
RDD计算过程中保存检查点时所需要的目录。
3.11 localProperties
3.12 _conf
SparkContext 的配置,调用SparkContext的clone方法的克隆而来。
3.13 _jars
用户设置的jar文件。当部署模式为YARN时,_jars由spark.jars 和spark.yarn.dist.jars的并集。
其他部署模式为spark.jars
3.14 _files
用户设置的文件。 通过spark.files进行指定。
3.15 _eventLogDir
spark.eventLog.enabled为true时启用。 通过spark.eventLog.dir 指定目录 默认为 /tmp/spark-events
3.16 _eventLogCodec
事件日志的的压缩算法。 压缩算法默认 为lz4,支持的压缩算法包括:lz4、snappy、lzf.
3.17 _hadoopConfiguration
hadoop的配置信息。
3.18 _executorMemory
Executor的内存大小。
3.19 _applicationId
3.20 _applicationAttemptId
3.21 _listenerBusStarted
LiveListenerBus是否已经启动的标记
3.22 nextShuffleID
生成下一个Shuffle的身份标识
3.23 nextRddID
生成下一个RDD的身份标识。