1、资源调度模式

1.1、local模式(本地)

运行该模式非常简单,只需要把Spark的安装包解压后,改一些常用的配置即可使用,而不用启动Spark的Master、Worker守护进程( 只有采用集群的Standalone方式时,才需要这两个角色),也不用启动Hadoop的各服务(除非要用到HDFS文件系统)。
Spark不一定非要跑在hadoop集群,可以在本地,起多个线程的方式来指定。将Spark应用以多线程的方式直接运行在本地,一般都是为了方便调试,本地单机模式分三类:
local: 只启动一个executor
local[k]: 启动k个executor
local[*]: 启动跟cpu数目相同的 executor

1.2、standalone模式

即独立模式, 自带完整的服务,可单独部署到一个集群中,资源管理和任务监控是Spark自己监控,无需依赖任何其他资源管理系统。这个模式也是其他模式的基础. 不使用其他调度工具时会存在单点故障,使用Zookeeper等可以解决

1.3、on-yarn模式

这是一种最有前景的部署模式。但限于YARN自身的发展,目前仅支持**粗粒度模式(**Coarse-grained Mode)。这是由于YARN上的Container资源是不可以动态伸缩的,一旦Container启动之后,可使用的资源不能再发生变化,不过这个已经在YARN计划中了。

应用场景:
考虑到尽量用一个统一的资源调度模式来运行多种任务,
这样可以减轻运维的工作压力,
同时也可以减少资源调度之间的配合(基于集群考虑)

spark on yarn 的支持两种模式:
1) 、yarn-cluster:Driver运行在 YARN集群下的某台机器上的JVM进程中,适用于生产环境;
2) 、yarn-client:Driver 运行在当前提交程序的机器上,适用于交互、调试
yarn-cluster和yarn-client的区别在于yarn appMaster,每个yarn app实例有一个appMaster进程,是为app启动的第一个container;负责从ResourceManager请求资源,获取到资源后,告诉NodeManager为其启动container。在实际生产环境中一般都采用yarn-cluster;而如果你仅仅是Debug程序,可以选择yarn-client。

1.4、messos模式

这是很多公司采用的模式,官方推荐这种模式(当然,原因之一是血缘关系)。正是由于Spark开发之初就考虑到支持Mesos,因此,目前而言,Spark运行在Mesos上会比运行在YARN上更加灵活,更加自然。目前在Spark On Mesos环境中,用户可选择两种调度模式之一运行自己的应用程序:

1)、 粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个Dirver和若干个Executor组成,其中,每个Executor占用若干资源,内部可运行多个Task(对应多少个“slot”)。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,即使不用, 运行过程中也要一直占用这些资源,,最后程序运行结束后,回收这些资源。

2)、细粒度模式(Fine-grained Mode):鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。
与粗粒度模式一样,应用程序启动时,先会启动executor,但每个executor占用资源仅仅是自己运行所需的资源,不需要考虑将来要运行的任务,之后,mesos会为每个executor动态分配资源,每分配一些,便可以运行一个新任务,单个Task运行完之后可以马上释放对应的资源。每个Task会汇报状态给Mesos slave和Mesos Master,便于更加细粒度管理和容错,这种调度模式类似于MapReduce调度模式,每个Task完全独立,优点是便于资源控制和隔离,但缺点也很明显,短作业运行延迟大。

1.5、docker

Docker是一种相比虚拟机更加轻量级的虚拟化解决方案,所以在Docker上搭建Spark集群具有可行性。

1.6、cloud

2、这么多资源调度模式,到底用哪种比较好?

需要通过公司需求和运行速度来综合衡量

3、哪种调度模式速度快呢?

standalone模式

4、为什么有很多企业在用spark-on-yarn模式?

考虑到尽量用一个统一的资源调度模式来运行多种任务,
这样可以减轻运维的工作压力,
同时也可以减少资源调度之间的配合(基于集群考虑)

5、Yarn的任务调度流程

1、client向ResourceManager注册并提交任务
2、ResourceManager向NodeManager进行通信,开始在某个NodeManager启动AppMaster
3、AppMaster启动后开始向ResourceManager申请资源
4、ApplicationManager开始资源调度,开始通知NodeManager启动YarnChild
5、YarnChild开始和AppMaster进行通信,AppMaster对所有YarnChild进行监控
6、MR执行完成以后,YarnChild被AppMaster回收,AppMaster把自己回收掉9