SparkContext是所有spark程序的引擎,它的配置参数由SparkConf负责。SparkConf内部主要是通过ConcurrentHashMap来维护Spark配置属性。
SparkContext的初始化步骤如下:
1.创建Saprk执行环境SparkEnv;
2.创建RDD清理器metadataCleaner;
3.创建并初始化SparkUI;
4.Hadoop相关配置及Executor环境变量的设置;
5.创建任务调度TaskScheduler;
6.创建和启动DAGscheduler;
7.TaskScheduler的启动;
8.初始化模块管理器BlockManager;
9.启动测量系统MetricsSystem;
10.创建和启动Executor分配管理器ExecutorAllocationManager;
11.ContextCleaner的创建与启动;
12.Spark环境更新;
13.创建DAGSchedulerSource和BlockManagerSource;
14.将SparkContext标记为激活;
在SparkContext中,通过createTaskScheduler方法来创建一个Taskscheduler,利用模式匹配,来生成TaskschedulerImpl和不同环境下的SchedulerBackend。
TaskschedulerImpl源码给出的解释如下:
1.顶层通过操作一个SchedulerBackend,针对不同类的cluster(standalone,yarn,mesos),调度task;
2.它也可以使用一个LocalBackend,并将isLocal参数设置为True,来在本地模式下工作;
3.它负责处理一些通用的逻辑,比如决定多个job的调度顺序,启动推测任务执行;
4.客户端首先应该调用它的initialize()方法和start()方法,然后通过runTasks()方法提交task sets
在initialize方法中,传入SchedulerBackend参数,会生成一个job的线程池,并且对于线程的调用有FIFO和FAIR两种策略。
在start方法中,会调用SchedulerBackend的start方法。
在SparkDepolySchedulerBackend中,会生成ApplicationDescription,它就代表了当前执行的这个application的一些情况,包括application最大需要多少cpu,core,每个slave上需要多少内存。还会生成一个AppClient通过它的tryRegisterAllMasters方法将信息发送到master上。
下面给出一张图给出了源码的调用过程:
在SparkContext中,还创建了DAGScheduler,实现了面向stage的调度机制的高层次的调度层。它会为每个job计算一个stage的DAG(有向无环图),追踪RDD和stage的输出是否被物化了(物化就是说,写入了磁盘或者内存等地方),并且寻找一个最少消耗(最小,最优)调度机制来运行job。它会将stage作为task sets提交到底层的TaskSchedulerImpl上,来在集群上运行它们(task)。
除了处理stage的DAG,它还负责决定运行每个task的最佳位置,基于当前的缓存状态,将这些最佳位置提交给底层的TaskSchedulerImpl。此外,它会处理由于shuffle输出文件丢掷导致的失败,在这种情况下,旧的stage可能就会被重新提交。一个stage内部的失败,如果不是由于shuffle文件丢失导致的,会被TaskScheduler处理,它会多次重试每一个task,直到最后,实在不行了才会取消整个stage。