sparkcontext是开发spark应用的入口,它负责和整个集群的交互,包括创建rdd,accumulators and broadcast variables。理解spark的架构,需要从这个入口开始。下图是官网的架构图。
driverprogram就是用户提交的程序,这里边定义了sparkcontext的实例。sparkcontext定义在core/src/main/scala/org/apache/spark/sparkcontext.scala。
spark默认的构造函数接受org.apache.spark.sparkconf, 通过这个参数我们可以自定义本次提交的参数,这个参数会覆盖系统的默认配置。
先上一张与sparkcontext相关的类图:
下面是sparkcontext非常重要的数据成员的定义:
通过createtaskscheduler,我们可以获得不同资源管理类型或者部署类型的调度器。看一下现在支持的部署方法:
主要的逻辑从line 20开始。主要通过传入的master url来生成scheduler 和 scheduler backend。对于常见的standalone的部署方式,我们看一下是生成的scheduler 和 scheduler backend:
org.apache.spark.scheduler.taskschedulerimpl通过一个schedulerbackend管理了所有的cluster的调度;它主要实现了通用的逻辑。对于系统刚启动时,需要理解两个接口,一个是initialize,一个是start。这个也是在sparkcontext初始化时调用的:
由此可见,初始化主要是schedulerbackend的初始化,它主要时通过集群的配置来获得调度模式,现在支持的调度模式是fifo和公平调度,默认的是fifo。
start的实现如下:
主要是backend的启动。对于非本地模式,并且设置了spark.speculation为true,那么对于指定时间未返回的task将会启动另外的task来执行。其实对于一般的应用,这个的确可能会减少任务的执行时间,但是也浪费了集群的计算资源。因此对于离线应用来说,这个设置是不推荐的。
org.apache.spark.scheduler.cluster.sparkdeployschedulerbackend是standalone模式的schedulerbackend。它的定义如下:
看一下它的start:
接下来,我们将对taskscheduler,schedulerbackend和dag scheduler进行详解,来逐步揭开他们的神秘面纱。