ITPub博客

首页 > 大数据 > > 大话Spark(6)-源码之SparkContext原理剖析

大话Spark(6)-源码之SparkContext原理剖析

作者:格伯纳 时间:2020-05-12 12:10:12 0 删除 编辑

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源码的构造过程,感谢阅读。


程序员灯塔:如何进BAT,有了这个篇面试秘籍,成功率高达80%!!(附资料)​zhuanlan.zhihu.com图标


程序员灯塔:详细讲解MapReduce二次排序过程​zhuanlan.zhihu.com图标


程序员灯塔:教程+资源,python scrapy实战爬取知乎最性感妹子的爆照合集​zhuanlan.zhihu.com图标

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3120031/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    983936