SparkContext是整个spark程序通往集群的唯一通道,他是程序的起点,也是程序的终点。
我们的每一个spark个程序都需要先创建SparkContext,接着调用SparkContext的方法, 比如说 sc.textFile(filepath),程序最后也会调用sc.stop()来退出。
让我们来一起看下SparkContext里面到底是如何实现的吧!

1 SparkContext内的三大核心对象:DAGScheduler,TaskScheduler,SchedulerBackend

DAGScheduler:面向Stage调度机制的高层调度器,会为每个job计算一个Stage的DAG(有向无环图)。追踪RDD和Stage的输出是否物化(写磁盘或内存),并且执行一个最优的调度机制来执行。将stage作为tasksets提交到底层的TaskScheduler并在集群上运行。DAGScheduler监控作业运行调度的过程,如果某个阶段运行失败,会重新提交提交该调度阶段。

TaskScheduler:是一个接口,底层调度器。会根据ClusterManager的不同有不同的实现,在Standalone模式下的实现为TaskSchedulerImpl。接收DAGScheduler发过来的任务集,并以任务的形式分发到集群worker节点的Executor中去运行,任务失败TaskScheduler负责重试。如果TaskScheduler发现某个任务一直没运行完,可能会启动同样的任务去运行一个任务,结果选取早运行完的那个任务的(预测执行)。

SchedulerBackend:是一个接口,根据ClusterManager的不同会有不同的实现,Standalone模式下是StandaloneSchedulerBackend(2.3版本, 1.x版本是SparkDeploySchedulerBackend)底层接受TaskSchedulerImpl的控制,实际负责Master的注册和Tasks发送到Executor等操作。

2.1 图示SparkContext实例化过程

如下图所示,我们看下SparkContext在实例化过程中,会创建多少核心实例来完成整个应用程序的注册。

2.2 时序图

3 主要内容描述

  • createTaskScheduler
  • createSchedulerBackend
  • SchedulerBackend的initialize初始化构造默认FIFO调度吃
  • new DAGScheduler
  • 创建StandaloneAppClient与spark集群通信
  • 创建AppClient,ClientEndPoint(向master注册)
  • 发消息RegisterApplication
  • ClientEndpoint.receive()函数接收master的回复消息

4 通过源码看SparkContext实例化过程(Standalone模式)

scala中不在方法里的成员都会被实例化,开始最关键的方法是createTaskScheduler,它是位于 SparkContext 的 构造函数中,当它实例化时会直接被调用。

createTaskScheduler创建了TaskSchedulerImpl并通过StandaloneSchedulerBackend对其进行初始化。

createTaskScheduler返回scheduleBackend和TaskScheduler, 然后又基于TaskScheduler构造DAGScheduler。

  • SparkContext调用createTaskScheduler方法,返回SchedulerBackend和TaskScheduler。

  • 下createTaskScheduler方法内部:根据不同的master url创建不同的TaskScheduler实现和不同的SchedulerBackend实现。 master url就是创建SparkContext的时候传的,例如下面的local

    val conf = new SparkConf().setAppName("TestApp").setMaster("local")
    val sc = new SparkContext(conf)
    

  • taskSchedulerImpl的初始化方法,创建一个默认FIFO的调度池:

  • taskSchedulerImpl初始化后,随即为其设置DAGScheduler,然后调用其start()方法:

  • 在taskSchedulerImpl的start()方法中再调用backend(StandaloneSchedulerBackend)的start()方法,其中最重要的就是创建ApplicationDescription和AppClient

  • 创建ApplicationDescription和AppClient

  • ApplicationDescription存放当前应用程序信息,name,cores,memory等。

  • AppClient是Application与Spark通信的组件。在appClient.start()的时候会创建内部类ClientEndPoint

  • clientEndPoint注册master。

  • 注册的时候会从线程池中拿出一个线程并且会带上APPDescription中的作业信息。

  • ClientEndpoint.receive接收master返回的消息,根据不同的返回消息做不同的操作。

  • SparkContext.DAGScheduler

  • 创建SparkUI

以上就是SparkContext源码的构造过程,感谢阅读。
End。

版权声明:本文为wangtcc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wangtcc/p/da-huaSpark-6yuan-ma-zhiSparkContext-yuan-li-pou-x.html