Spark的运行模式多种多样,在单机上既可以以本地模式运行,也可以以伪分布式模式运行。而当以分布式的方式运行在Cluster集群中时,底层的资源调度可以使用Mesos 或者是Hadoop Yarn ,也可以使用Spark自带的Standalone Deploy模式

Spark处于活跃的开发过程中,代码变动频繁,所以本文尽量不涉及具体的代码分析,仅从结构和流程的角度进行阐述。

运行模式列表

基本上,Spark的运行模式取决于传递给SparkContext的MASTER环境变量的值,个别模式还需要辅助的程序接口来配合使用,目前支持的Master字符串及URL包括:

Local[N] :本地模式 使用N个线程

Local-cluster :伪分布式模式

Spark:// :Standalone Deploy模式,需要部署Spark到相关节点

Mesos:// :Mesos模式,需要部署Spark和Mesos到相关节点

Yarn-standalone :SparkContext和任务都运行在Yarn集群中

Yarn-client :SparkConext运行在本地,task运行在Yarn集群中

此外还有一些用于调试的URL

大致工作流程

总体上来说,这些运行模式都基于一个相似的工作流程,SparkContext作为调度的总入口,在初始化过程中会分别创建DAGScheduler作业调度和TaskScheduler任务调度两极调度模块

作业调度模块是基于Stage的高层调度模块,它为每个Spark Job计算具有依赖关系的多个Stage任务阶段(通常根据Shuffle来划分Stage),然后将每个Stage划分为具体的一组任务(通常会考虑数据的本地性等)以Task Sets的形式提交给底层的任务调度模块来具体执行

任务调度模块负责具体启动任务,监控和汇报任务运行情况

不同运行模式的主要区别就在于他们各自实现了自己特定的任务调度模块,用来实际执行计算任务

相关基本类

TaskScheduler  / SchedulerBackend

为了抽象出一个公共的接口供DAGScheduler作业调度模块使用,所有的这些运行模式实现的任务调度模块都是基于两个Trait:TaskScheduler和 SchedulerBackend

理论上,TaskScheduler的实现用于与DAGScheduler交互,负责任务的具体调度和运行,核心接口是submitTasks 和 CancelTasks

SchedulerBackend的实现用于与底层资源调度系统交互(如mesos/YARN),配合TaskScheduler实现具体任务执行所需的资源分配,核心接口是receiveOffers

这两者之间的实际交互过程取决于具体调度模式,理论上这两者的实现是成对匹配工作的,拆分成两部分,有利于相似的调度模式共享代码功能模块

TaskSchedulerImpl

TaskSchedulerImpl实现了TaskScheduler Trait,提供了大多数Local和Cluster调度模式的任务调度接口,此外还实现了resourceOffers和statusUpdate两个接口给Backend调用,用于提供调度资源和更新任务状态。另外在提交任务,更新状态等阶段调用Backend的receiveOffers函数用来发起一次任务资源调度请求

Executor

实际任务的运行,最终都由Executor类来执行,Executor对每一个Task启动一个TaskRunner类,并通过ExectorBackend的接口返回task运行结果

具体实现

Local[N]

Local本地模式使用 LocalBackend 配合TaskSchedulerImpl

LocalBackend 响应Scheduler的receiveOffers请求,根据可用CPU Core的设定值[N]直接生成WorkerOffer资源返回给Scheduler,并通过Executor类在线程池中依次启动和运行Scheduler返回的任务列表

Spark Standalone Deploy

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

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

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

Yarn-client模式中,SparkContext运行在本地,该模式适用于应用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进行通讯,后续任务调度流程相同

概括

总体而言,各种运行模式就是通过各种手段启动匹配的SchedulerBackend和ExecutorBackend。除了Local模式和细粒度的Mesos模式,其它模式最终都是通过基于Akka的CoarseGrainedSchedulerBackend和CoarseGrainedExecutorBackend完成任务调度

Spark internal - 多样化的运行模式(上)的更多相关文章

  1. Spark internal - 多样化的运行模式 (下)

    Spark的各种运行模式虽然启动方式,运行位置,调度手段有所不同,但它们所要完成的任务基本都是一致的,就是在合适的位置安全可靠的根据用户的配置和Job的需要管理和运行Task,这里粗略的列举一下在运行 ...

  2. 2 Spark角色介绍及运行模式

    第2章 Spark角色介绍及运行模式 2.1 集群角色 从物理部署层面上来看,Spark主要分为两种类型的节点,Master节点和Worker节点:Master节点主要运行集群管理器的中心化部分,所承 ...

  3. 大话Spark(5)-三图详述Spark Standalone/Client/Cluster运行模式

    之前在 大话Spark(2)里讲过Spark Yarn-Client的运行模式,有同学反馈与Cluster模式没有对比, 这里我重新整理了三张图分别看下Standalone,Yarn-Client 和 ...

  4. 【Spark深入学习-11】Spark基本概念和运行模式

    ----本节内容------- 1.大数据基础 1.1大数据平台基本框架 1.2学习大数据的基础 1.3学习Spark的Hadoop基础 2.Hadoop生态基本介绍 2.1Hadoop生态组件介绍 ...

  5. Spark的几种运行模式

    1.local单机模式,结果xshell可见:./bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[1 ...

  6. Spark的 运行模式详解

    Spark的运行模式是多种多样的,那么在这篇博客中谈一下Spark的运行模式 一:Spark On Local 此种模式下,我们只需要在安装Spark时不进行hadoop和Yarn的环境配置,只要将S ...

  7. 理解Spark运行模式(二)(Yarn Cluster)

    上一篇说到Spark的yarn client运行模式,它与yarn cluster模式的主要区别就是前者Driver是运行在客户端,后者Driver是运行在yarn集群中.yarn client模式一 ...

  8. 在local模式下的spark程序打包到集群上运行

    一.前期准备 前期的环境准备,在Linux系统下要有Hadoop系统,spark伪分布式或者分布式,具体的教程可以查阅我的这两篇博客: Hadoop2.0伪分布式平台环境搭建 Spark2.4.0伪分 ...

  9. Spark运行模式与Standalone模式部署

    上节中简单的介绍了Spark的一些概念还有Spark生态圈的一些情况,这里主要是介绍Spark运行模式与Spark Standalone模式的部署: Spark运行模式 在Spark中存在着多种运行模 ...

随机推荐

  1. java之集合概述

    集合也称容器:从大的类别分成两类:Collection和Map,也即:单列和双列列表. java编程思想中一张图说明该体系的整体结构:其中黑色着重的类是经常使用的类. 1 Collection Col ...

  2. bzoj 1927 [Sdoi2010]星际竞速——网络流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1927 每个点拆点保证只经过一次. 主要是如果经过了这个点,这个点应该向汇点流过去表示经过了它 ...

  3. bzoj 3779 重组病毒——LCT维护子树信息

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3779 调了很久……已经懒得写题解了.https://www.cnblogs.com/Zinn ...

  4. cocos2d-js 3.0 ios平台编译打包

    原帖在http://www.cocoachina.com/bbs/read.php?tid=209356 整理到github的https://github.com/faint2death/cocos2 ...

  5. ssi框架学习总结

    框架简介: 相信大家对于mvc的三层架构已经灰常熟悉了,在这就不细讲了,个人感觉ssi的框架结构还是比较典型的mvc三层架构,还是比较容易上手的.关于这块的入门我想特别感谢下FrankHui童鞋,在他 ...

  6. idea maven 打包 引用本地jar

    1将本地jar包导入到mvn本地库 mvn install:install-file -Dfile=/Users/liuqiang/Documents/gmpl/gmpl-server/lib/ali ...

  7. [Java.Web] Servlet 的一些细节

    本文来自 传智播客视频PPT 1. 由于客户端是通过 URL 地址访问 web 服务器中的资源,所以 Servlet 程序若想被外界访问,必须把 servlet 程序映射到一个 URL 地址上,这个工 ...

  8. angular的继承作用域通信

    本人学了一段时间的angular,angular之间怎样通信,我就总结以下几点,如果有哪位大神认为不对,敬请赐教. 1.父子之间的作用域进行通信 html <div ng-controller= ...

  9. git 怎么上传文件到github上

    1.安装git     sudo  apt-get install git 2.配置全局变量     git config --global user.name langhunm     git co ...

  10. 学生党如何拿到阿里技术offer:《阿里面试经历-2014.4.18研发实习生面试经历(失败)》

    我们分享的上一篇文章是一位学长在大三的时候面试阿里实习生成功的经历的分享,其实就像学长在上一篇文章最后说的那样“面试并没有想的那么难,运气也会占一部分.”,其实我个人觉得,对于我们而言,自己越努力就会 ...