博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spark源码分析:多种部署方式之间的区别与联系
阅读量:6343 次
发布时间:2019-06-22

本文共 3091 字,大约阅读时间需要 10 分钟。

  hot3.png

在我们谈到了Context的初始化过程会做好几件事情(这里就不再列出,可以去查看),其中做了一件重要的事情就是创建TaskScheduler

1 // Create and start the scheduler
2   private[spark] var taskScheduler =<span class="wp_keywordlink_affiliate"><a href="" title=""target="_blank"data-original-title="View all posts in Spark">Spark</a></span>Context.createTaskScheduler(this, master)

  在createTaskScheduler方法中,会根据用户传进来的master URL分别初始化不同的SchedulerBackend和ExecutorBackend。而且从代码中我们可以看到master URL多大九种格式。但是在代码中SchedulerBackend的种类可没九种,只有五种;而ExecutorBackend只有三种,我们先来看看这些SchedulerBackend和ExecutorBackend的类继承关系:

如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:
iteblog_hadoop

每一个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进行注册。

  yarn-cluster模式作业从提交到运行的整个过程请参见本博客文章:

4、yarn-client

  yarn-cluster集群模式涉及到的类有YarnClientClusterScheduler和YarnClientSchedulerBackend。YarnClientClusterScheduler继承自TaskSchedulerImpl,并对其中的getRackForHost方法进行了重写。

  Yarn-client模式下,会在集群外面启动一个ExecutorLauncher来作为driver,并想集群申请Container,来启动CoarseGrainedExecutorBackend,并向CoarseGrainedSchedulerBackend中的DriverActor进行注册。

  yarn-client模式作业从提交到运行的整个过程请参见本博客文章:

5、Mesos

  Mesos模式调度方式有两种:粗粒度和细粒度。粗粒度涉及到的类有CoarseMesosSchedulerBackend和TaskSchedulerImpl类;而细粒度涉及到的类有MesosSchedulerBackend和TaskSchedulerImpl类。CoarseMesosSchedulerBackend和 MesosSchedulerBackend都继承了MScheduler(其实是Mesos的Scheduler),便于注册到Mesos资源调度的框架中。选择哪种模式可以通过spark.mesos.coarse参数配置。默认的是MesosSchedulerBackend。

  上面涉及到Spark的许多部署模式,究竟哪种模式好这个很难说,需要根据你的需求,如果你只是测试Spark Application,你可以选择local模式。而如果你数据量不是很多,Standalone 是个不错的选择。当你需要统一管理集群资源(Hadoop、Spark等)那么你可以选择Yarn,但是这样维护成本就会变高。
  yarn-cluster和yarn-client模式内部实现还是有很大的区别。如果你需要用于生产环境,那么请选择yarn-cluster;而如果你仅仅是Debug程序,可以选择yarn-client。

转载于:https://my.oschina.net/Rayn/blog/500690

你可能感兴趣的文章
危急,不要任意让站点记住password自己主动登陆!
查看>>
初试ASP.NET Web API/MVC API(附Demo)
查看>>
Unable to locate package错误解决办法
查看>>
Spark 官方博文专区(目录)
查看>>
[原][osgEarth]添加自由飞行漫游器
查看>>
AnimatorCompatHelper clearInterpolator
查看>>
代码审查 Code Review
查看>>
fastjson如何指定字段不序列化
查看>>
翻译:window function(已提交到MariaDB官方手册)
查看>>
centos安装Django之一:安装openssl
查看>>
linux下mysql开启远程访问权限及防火墙开放3306端口
查看>>
[日常] Go语言圣经--示例: 并发的Echo服务
查看>>
nginx配置80端口访问8080+项目名地址
查看>>
BZOJ1969: [Ahoi2005]LANE 航线规划(LCT)
查看>>
linux内存管理之malloc、vmalloc、kmalloc的区别
查看>>
ubuntu14.04终端分屏terminator的安装使用与配置
查看>>
amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown
查看>>
转:比特币入门教程
查看>>
自旋锁、排队自旋锁、MCS锁、CLH锁
查看>>
GreenDao 数据库升级 连接多个DB文件 或者指定不同的model&dao目录
查看>>