编程语言
首页 > 编程语言> > Spark2.0.2模式匹配源码分析

Spark2.0.2模式匹配源码分析

作者:互联网

1.在SparkContext启动的时候初始化DAGSchedule调度器

在这里插入图片描述
_taskScheduler在_dagsheduler初始化之前初始化,是因为DAGScheduler的构造器需要一个SparkContext的实例对象和一个TaskScheduler的实例对象
在这里插入图片描述

2. 在createTaskScheduler方法里进行模式匹配

在这里插入图片描述
我这里是yarn模式,它在源码中是这样匹配的:
在这里插入图片描述
接下来是重点:
在这里插入图片描述

ServiceLoader.load(classOf[ExternalClusterManager], loader).asScala.filter(_.canCreate(url))

这行代码起什么作用呢:
先加载所有ExternalClusterManager的实现类,然后根据方法中的canCreate方法来判断是哪一个实现是符合url 的规制的将这个实例对象判断出来。

于是,就来到了这里:
在这里插入图片描述

3.调用start()方法

回到SparkContext中:
在这里插入图片描述
在这里插入图片描述

case "cluster" => new YarnClusterScheduler(sc)
case "client" => new YarnScheduler(sc)
case "cluster" => new YarnClusterSchedulerBackend(scheduler.asInstanceOf[TaskSchedulerImpl], sc)
case "client" => new YarnClientSchedulerBackend(scheduler.asInstanceOf[TaskSchedulerImpl], sc)

执行 initialize() 方法传入之前构造的 scheduler , backend 。

cm.initialize(scheduler, backend)

在这里插入图片描述
终于,还是到了 TaskSchedulerImpl ,根据调度模式初始化调度池如下(同时还初始化了backend):
在这里插入图片描述

执行_taskScheduler.start(),不过在这之前先在DAGScheduler的构造器中设置DAGScheduler引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行taskScheduler实现类的start()方法(在这里是TaskSchedulerImpl):
在这里插入图片描述
这里调用的是backed.start(),实际上调用的是SchedulerBackend实现类中的start():
在这里插入图片描述
这个类是继承了SchedulerBackend的:

private[spark]
class CoarseGrainedSchedulerBackend(scheduler: TaskSchedulerImpl, val rpcEnv: RpcEnv)
  extends ExecutorAllocationClient with SchedulerBackend with Logging

而后,YarnSchedulerBackend继承CoarseGrainedSchedulerBackend

private[spark] abstract class YarnSchedulerBackend(
    scheduler: TaskSchedulerImpl,
    sc: SparkContext)
  extends CoarseGrainedSchedulerBackend(scheduler, sc.env.rpcEnv) 

因此,我们去查看YarnSchedulerBackend的实现类:

YarnClientSchedulerBackend
YarnClusterSchedulerBackend

由于之前的模式匹配,我们就能确定调用的是哪个类中的start()了!

标签:SparkContext,初始化,start,TaskSchedulerImpl,Spark2.0,源码,scheduler,sc,模式匹配
来源: https://blog.csdn.net/qq_39327985/article/details/86530019