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