转载自:http://blog.youkuaiyun.com/colorant/article/details/18549027
Spark的运行模式取决于传递给SparkContext的MASTER环境变量的值,有以下几种(参考http://spark.apache.org/docs/latest/submitting-applications.html):

简单介绍一下:
Local、Local[N]、Local[*]
本地模式使用 LocalBackend 配合TaskSchedulerImp。
LocalBackend 响应Scheduler的receiveOffers请求,根据可用CPU Core的设定值[N]直接生成WorkerOffer资源返回给Scheduler,并通过Executor类在线程池中依次启动和运行Scheduler返回的任务列表。
Spark://HOST:PORT
Standalone Deploy模式,需要部署Spark到相关节点。
Standalone模式使用SparkDeploySchedulerBackend配合TaskSchedulerImpl ,而SparkDeploySchedulerBackend本身拓展自CoarseGrainedSchedulerBackend。CoarseGrainedSchedulerBackend是一个基于Akka Actor实现的粗粒度的资源调度类,在整个SparkJob运行期间,CoarseGrainedSchedulerBackend会监听并持有注册给它的Executor资源(相对于细粒度的调度,Executor基于每个任务的生命周期创建和销毁),并且在接受Executor注册,状态更新,响应Scheduler请求等各种时刻,根据现有Executor资源发起任务调度流程
Executor本身通过各种途径启动,在Spark Standalone模式中,SparkDeploySchedulerBackend通过Client类向Spark Master 发送请求在独立部署的Spark集群中启动CoarseGrainedExecutorBackend,根据所需的CPU资源Core的数量,一个或多个CoarseGrainedExecutorBackend在Spark Worker节点上启动并注册给CoarseGrainedSchedulerBackend的DriverActor。
完成所需Actor的启动之后,之后的任务调度就在CoarseGrainedSchedulerBackend和CoarseGrainedExecutorBackend的Actor之间直接完成
Local-cluster
伪分布式模式,基于Standalone模式实现,实际就是在SparkContext初始化的过程中现在本地启动一个单机的伪分布Spark集群,之后的流程与Standalone模式相同。
Mesos://HOST:PORT
Mesos模式,需要部署Spark和Mesos到相关节点。
Mesos模式根据调度的颗粒度,分别使用CoarseMesosSchedulerBackend和MesosSchedulerBackend配合TaskSchedulerImpl。
粗粒度的CoarseMesosSchedulerBackend拓展自CoarseGrainedSchedulerBackend,相对于父类额外做的工作就是实现了MScheduler接口,注册到Mesos资源调度的框架中,用于接收Mesos的资源分配,在得到资源后通过Mesos框架远程启动CoarseGrainedExecutorBackend,之后的任务交互过程和Spark standalone模式一样,由DriverActor和Executor Actor直接完成。
细粒度的MesosSchedulerBackend不使用CoarseMesosSchedulerBackend的基于Actor的调度模式,因此直接继承自SchedulerBackend,同样实现了MScheduler接口,注册到Mesos资源调度的框架中,用于接收Mesos的资源分配。不同的是在接收资源后,MesosSchedulerBackend启动的是基于Task任务的远程Executor,通过在远程执行 ./sbin/spark-executor命令来启动MesosExecutorBackend,在MesosExecutorBackend中直接launch对应的Task。
Yarn-standalone
SparkContext和任务都运行在Yarn集群中。
Yarn-Standalone模式相对其它模式有些特殊,需要由外部程序辅助启动APP。用户的应用程序通过org.apache.spark.deploy.yarn.Client启动
Client通过Yarn Client API在Hadoop集群上启动一个Spark ApplicationMaster,Spark ApplicationMaster首先注册自己为一个YarnApplication Master,之后启动用户程序,SparkContext在用户程序中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler,YarnClusterScheduler只是对TaskSchedulerImpl 的一个简单包装,增加对Executor的等待逻辑等。
然后根据Client传递过来的参数,SparkApplicationMaster通过Yarn RM/NM的接口在集群中启动若干个Container用于运行CoarseGrainedExecutorBackend往CoarseGrainedSchedulerBackend注册。之后的任务调度流程同上述其它Cluster模式。
Yarn-client
SparkConext运行在本地,task运行在Yarn集群中,该模式适用于应用APP本身需要在本地进行交互的场合,比如Spark Shell,Shark等。
Yarn-client模式下,SparkContext在初始化过程中启动YarnClientSchedulerBackend(同样拓展自CoarseGrainedSchedulerBackend),该Backend进一步调用org.apache.spark.deploy.yarn.Client在远程启动一个WorkerLauncher作为Spark的Application Master,相比Yarn-standalone模式,WorkerLauncher不再负责用户程序的启动(已经在客户端本地启动),而只是启动Container运行CoarseGrainedExecutorBackend与客户端本地的Driver进行通讯,后续任务调度流程相同。
Spark的运行模式取决于传递给SparkContext的MASTER环境变量的值,有以下几种(参考http://spark.apache.org/docs/latest/submitting-applications.html):
简单介绍一下:
Local、Local[N]、Local[*]
本地模式使用 LocalBackend 配合TaskSchedulerImp。
LocalBackend 响应Scheduler的receiveOffers请求,根据可用CPU Core的设定值[N]直接生成WorkerOffer资源返回给Scheduler,并通过Executor类在线程池中依次启动和运行Scheduler返回的任务列表。
Spark://HOST:PORT
Standalone Deploy模式,需要部署Spark到相关节点。
Standalone模式使用SparkDeploySchedulerBackend配合TaskSchedulerImpl ,而SparkDeploySchedulerBackend本身拓展自CoarseGrainedSchedulerBackend。CoarseGrainedSchedulerBackend是一个基于Akka Actor实现的粗粒度的资源调度类,在整个SparkJob运行期间,CoarseGrainedSchedulerBackend会监听并持有注册给它的Executor资源(相对于细粒度的调度,Executor基于每个任务的生命周期创建和销毁),并且在接受Executor注册,状态更新,响应Scheduler请求等各种时刻,根据现有Executor资源发起任务调度流程
Executor本身通过各种途径启动,在Spark Standalone模式中,SparkDeploySchedulerBackend通过Client类向Spark Master 发送请求在独立部署的Spark集群中启动CoarseGrainedExecutorBackend,根据所需的CPU资源Core的数量,一个或多个CoarseGrainedExecutorBackend在Spark Worker节点上启动并注册给CoarseGrainedSchedulerBackend的DriverActor。
完成所需Actor的启动之后,之后的任务调度就在CoarseGrainedSchedulerBackend和CoarseGrainedExecutorBackend的Actor之间直接完成
Local-cluster
伪分布式模式,基于Standalone模式实现,实际就是在SparkContext初始化的过程中现在本地启动一个单机的伪分布Spark集群,之后的流程与Standalone模式相同。
Mesos://HOST:PORT
Mesos模式,需要部署Spark和Mesos到相关节点。
Mesos模式根据调度的颗粒度,分别使用CoarseMesosSchedulerBackend和MesosSchedulerBackend配合TaskSchedulerImpl。
粗粒度的CoarseMesosSchedulerBackend拓展自CoarseGrainedSchedulerBackend,相对于父类额外做的工作就是实现了MScheduler接口,注册到Mesos资源调度的框架中,用于接收Mesos的资源分配,在得到资源后通过Mesos框架远程启动CoarseGrainedExecutorBackend,之后的任务交互过程和Spark standalone模式一样,由DriverActor和Executor Actor直接完成。
细粒度的MesosSchedulerBackend不使用CoarseMesosSchedulerBackend的基于Actor的调度模式,因此直接继承自SchedulerBackend,同样实现了MScheduler接口,注册到Mesos资源调度的框架中,用于接收Mesos的资源分配。不同的是在接收资源后,MesosSchedulerBackend启动的是基于Task任务的远程Executor,通过在远程执行 ./sbin/spark-executor命令来启动MesosExecutorBackend,在MesosExecutorBackend中直接launch对应的Task。
Yarn-standalone
SparkContext和任务都运行在Yarn集群中。
Yarn-Standalone模式相对其它模式有些特殊,需要由外部程序辅助启动APP。用户的应用程序通过org.apache.spark.deploy.yarn.Client启动
Client通过Yarn Client API在Hadoop集群上启动一个Spark ApplicationMaster,Spark ApplicationMaster首先注册自己为一个YarnApplication Master,之后启动用户程序,SparkContext在用户程序中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler,YarnClusterScheduler只是对TaskSchedulerImpl 的一个简单包装,增加对Executor的等待逻辑等。
然后根据Client传递过来的参数,SparkApplicationMaster通过Yarn RM/NM的接口在集群中启动若干个Container用于运行CoarseGrainedExecutorBackend往CoarseGrainedSchedulerBackend注册。之后的任务调度流程同上述其它Cluster模式。
Yarn-client
SparkConext运行在本地,task运行在Yarn集群中,该模式适用于应用APP本身需要在本地进行交互的场合,比如Spark Shell,Shark等。
Yarn-client模式下,SparkContext在初始化过程中启动YarnClientSchedulerBackend(同样拓展自CoarseGrainedSchedulerBackend),该Backend进一步调用org.apache.spark.deploy.yarn.Client在远程启动一个WorkerLauncher作为Spark的Application Master,相比Yarn-standalone模式,WorkerLauncher不再负责用户程序的启动(已经在客户端本地启动),而只是启动Container运行CoarseGrainedExecutorBackend与客户端本地的Driver进行通讯,后续任务调度流程相同。