Spark源码剖析(三):SparkContext原理与源码剖析

一:SparkContext原理

千言万语不抵一张图啊!(看不懂也别急,把下面的源码看完后再回过来看这张图你就懂了)

@1-1

1-1

二:SparkContext源码剖析

SparkContext最重要的功能就是创建了TaskScheduler、DAGSchedule和SparkUI(4040),但是我们这篇文章主要剖析TaskScheduler的源码(重要!),其余两个暂不做详解。

废话不多说,源码入口为:spark-1.3.0\core\src\main\scala\org\apache\spark\SparkContext.scala

@2-1

2-1

 
  
这里可以看到SparkContext先创建TaskScheduler,接着创建DAGSchedule,最后调用TaskScheduler的start方法启动。 

TaskScheduler初始化

  1. 首先调用createTaskScheduler方法,该方法会根据应用程序的提交模式提供不同的初始化程序(我们这里分析standalone模式),首先创建TaskSchedulerImpl(就是我们所说的TaskScheduler,底层主要基于SparkDeploySchedulerBackend来工作)和SparkDeploySchedulerBackend(在底层接收TaskSchedulerImpl的控制,实际上负责与Master的注册、Executor的反注册,task发送到Executor等操作)。 
      
    图2-1中的createTaskScheduler方法
@2-2

2-2

 
  
TaskSchedulerImpl的官方简介
@2-3

2-3

 
  1. 接着图2-2中TaskSchedulerImpl执行其init方法,创建SchedulePool调度池,它有不同的优先策略(比如FIFO)。
@2-4

2-4

 
  1. 然后返回图2-1中TaskSchedulerImpl调用其start方法,该start方法中会调用SparkDeploySchedulerBackend的start方法。
@2-5

2-5

@2-6

2-6

  1. 在SparkDeploySchedulerBackend的start方法中,会创建AppClient对象,该对象的start方法又会启动ClientActor线程,该线程会去调用一系列方法registerWithMaster() -> tryRegisterAllMasters(),最终tryRegisterAllMasters()方法会向所有Master发送RegisterApplication(是case class,里面封装了Application的信息)进行Application的注册。

Alt text

Alt text

Alt text

Alt text

Alt text

Alt text

  1. Spark Master接收到该Application的注册后,会为其分配资源,随后通知相关的Worker为该Application启动相对应的Executor。 
  2. 所有Executor启动后会反向注册到SparkDeploySchedulerBackend(这样Driver中的TaskSchedule就知道哪些Executor为其运行Application了)。 

DAGSchedule初始化

DAGSchedule位于TaskSchedule后被创建,底层基于DAGScheduleEventProcessActor线程进行通信。

Alt text 
  
DAGSchedule源码简介

Alt text

SparkUI(4040)

SparkContext中还启动了一个jetty服务器,来提供web服务,显示application运行的状态,这个端口我们在跑长时间应用的时候经常会使用到。

Alt text

Alt text

posted @ 2017-12-30 21:06  小丑进场  阅读(556)  评论(1编辑  收藏  举报