Spark源码解读系列--SparkContext的初始化(1)
Spark源码解读系列主要是基于《深入理解Spark--核心思想与源码分析》这本书的,另外加上我个人的补充,由于自己也是Spark的初学者,所以暂时不能解读源码背后的设计思想,只能结合书来解读源码的逻辑和功能。
SparkContext的初始化是Driver应用程序提交执行的前提,以下内容将会以local模式,代码顺序进行讲解。
SparkConf
SparkContext的配置参数是由SparkConf负责的,SparkConf初始化将会利用ConcurrentHashMap来维护各种属性,属性都是以“Spark.”开头的。代码如下:
默认loadDefaults是true,将会加载Utils.getSystemProperties返回的对象中以“spark.”开头的字符串。
SparkContext中主构造器的参数就是一个SparkConf参数:
CallSite存储了线程栈中最靠近栈顶的用户类及最靠近栈底的Scala或者Spark核心类信息。就像注释所说creationSite将会知道SparkContext在哪里被创建。如果allowMultipleContext为true,那么将会允许多个SparkContext实例,不会抛出异常,但会有log的警告,由属性spark.driver.allowMultipleContexts控制。在构造器中将会执行markPartiallyConstructed,标记这个SparkContext正在创建,阻止激活多个实例。
在初始化过程中,将会把主构造器中的config复制给var变量_conf,然后进行检查,而且有两个属性必须包括:"spark.master"和"spark.app.name",部分代码如下:
创建执行环境SparkEnv
SparkEnv是Spark的执行环境对象,其中包括众多与Executor执行相关的对象。SparkEnv可以存在于Driver(local模式)或者CoarseGrainedExecutorBackend进程中(Worker中)。SparkContext中的var变量_env将会通过createSparkEnv创建:
createSparkEnv有三个参数,传递的SparkConf,是否是isLocal,以及listenerBus采用监听器模式维护各类事件的处理。createSparkEnv将会调用SparkEnv对象的createDriverEnv
方法:
根据上面说到的,SparkEnv还存在于Executor中,所以也有对应的代码:
在方法createDriverEnv中会调用create创建SparkEnv,SparkEnv的构造步骤如下:
- 创建安全管理器SecurityManager
- 创建基于Akka的分布式消息系统ActorSystem
- 创建Map任务输出跟踪其mapOutputTracker
- 实例化ShuffleManager
- 创建ShuffleMemoryManeger
- 创建块传输服务BlockTransferService
- 创建BlockManagerMaster
- 创建块管理器BlockManager
- 创建广播管理器BroadcastManager
- 创建缓存管理器CacheManager
- 创建HTTP文件服务器HttpFileServer
- 创建测量系统MetricsSystem
- 创建SparkEnv
就下来的文章将会详细讲述上面在构造SparkEnv过程中执行的操作