在《Spark源码分析:多种部署方式之间的区别与联系(1)》我们谈到了SparkContext的初始化过程会做好几件事情(这里就不再列出,可以去《Spark源码分析:多种部署方式之间的区别与联系(1)》查看),其中做了一件重要的事情就是创建TaskScheduler。
1 |
// Create and start the scheduler |
2 |
private [spark] var taskScheduler = < span class = "wp_keywordlink_affiliate" >< a data-original-title = "查看Spark中的全部文章" href = "http://www.iteblog.com/archives/tag/spark" title = "" target = "_blank" > Spark < /a >< /span > Context.createTaskScheduler( this , master) |
在createTaskScheduler方法中,会根据用户传进来的master URL分别初始化不同的SchedulerBackend和ExecutorBackend。而且从代码中我们可以看到master URL多大九种格式。但是在代码中SchedulerBackend的种类可没九种,只有五种;而ExecutorBackend只有三种,我们先来看看 这些SchedulerBackend和ExecutorBackend的类继承关系:
每一个Application都对应了一个SchedulerBackend和多个ExecutorBackend。下面我们分别介绍各种运行模式所涉及到的类
1、Local模式
local模式出了伪集群模式(local-cluster),所有的local都是用到了LocalBackend和 TaskSchedulerImpl类。LocalBackend接收来自TaskSchedulerImpl的receiveOffers()调用,并 根据运行Application传进来的CPU核生成WorkerOffer,并调用scheduler.resourceOffers(offers) 生成Task,最后通过 executor.launchTask来执行这些Task。
2、Standalone
Standalone模式使用SparkDeploySchedulerBackend和 TaskSchedulerImpl,SparkDeploySchedulerBackend是继承自 CoarseGrainedSchedulerBackend类,并重写了其中的一些方法。
CoarseGrainedSchedulerBackend是一个粗粒度的资源调度类,在Spark job运行的整个期间,它会保存所有的Executor,在task运行完的时候,并不释放该Executor,也不向Scheduler申请一个新的 Executor。Executor的启动方式有很多中,需要根据Application提交的Master URL进行判断。在CoarseGrainedSchedulerBackend中封装了一个DriverActor类,它接受Executor注册 (RegisterExecutor)、状态更新(StatusUpdate)、响应Scheduler的ReviveOffers请求、杀死Task等 等。
在本模式中将会启动一个或者多个CoarseGrainedExecutorBackend。具体是通过AppClient类向Master请 求注册Application。当注册成功之后,Master会向Client进行反馈,并调用schedule启动Driver和 CoarseGrainedExecutorBackend,启动的Executor会向DriverActor进行注册。然后 CoarseGrainedExecutorBackend通过aunchTask方法启动已经提交的Task。
3、yarn-cluster
yarn-cluster集群模式涉及到的类有YarnClusterScheduler和 YarnClusterSchedulerBackend。YarnClusterSchedulerBackend同样是继承自 CoarseGrainedSchedulerBackend。而YarnClusterScheduler继承自TaskSchedulerImpl, 它只是简单地对TaskSchedulerImpl进行封装,并重写了getRackForHost和postStartHook方法。
Client类通过YarnClient在hadoop集群上启动一个Container,并在其中运行ApplicationMaster, 并通过Yarn提供的接口在集群中启动多个Container用于运行CoarseGrainedExecutorBackend,并向 CoarseGrainedSchedulerBackend中的DriverActor进行注册。
4、yarn-client
yarn-cluster集群模式涉及到的类有YarnClientClusterScheduler和 YarnClientSchedulerBackend。YarnClientClusterScheduler继承自 TaskSchedulerImpl,并对其中的getRackForHost方法进行了重写。
Yarn-client模式下,会在集群外面启动一个ExecutorLauncher来作为driver,并想集群申请Container,来启动 CoarseGrainedExecutorBackend,并向CoarseGrainedSchedulerBackend中的 DriverActor进行注册。
5、Mesos
Mesos模式调度方式有两种:粗粒度和细粒度。粗粒度涉及到的类有CoarseMesosSchedulerBackend和 TaskSchedulerImpl类;而细粒度涉及到的类有MesosSchedulerBackend和TaskSchedulerImpl类。 CoarseMesosSchedulerBackend和 MesosSchedulerBackend都继承了MScheduler(其实是 Mesos的Scheduler),便于注册到Mesos资源调度的框架中。选择哪种模式可以通过spark.mesos.coarse参数配置。默认的 是MesosSchedulerBackend。
yarn-cluster和yarn-client模式内部实现还是有很大的区别。如果你需要用于生产环境,那么请选择yarn-cluster;而如果你仅仅是Debug程序,可以选择yarn-client。
本博客文章除特别声明,全部都是原创!
尊重原创,转载请注明: 转载自过往记忆(http://www.iteblog.com/)
本文链接地址: 《Spark源码分析:多种部署方式之间的区别与联系(2)》(http://www.iteblog.com/archives/1185)