Spark 2.1.0的运行模式

时间:2022-05-06 09:21:14

Spark 2.1.0支持的运行模式

  Spark支持多种运行模式,可以在集群环境中运行,也可以单机本地运行,或者在单机上部署伪分布集群来运行Spark。

  Spark 2.1.0原生支持三种集群:Spark原生提供的Standalone集群,以及外部资源调度框架Apache Mesos和Hadoop Yarn。

目前随着Kubernetes的火热,Spark on K8S的呼声也越来越高。预计不久将来Kube应该也会成为Spark原生支持的外部集群框架。

  Spark应用程序通过设置SparkContext中的Master URL来指定运行模式,各种运行模式以及传递的Master URL总结如下:

运行模式 Master URL 说明
本地 local 本地单线程运行Spark(无任何并行)
本地 local[K] 本地K条线程运行Spark(K的理想值为当前节点CPU核心数)
本地 local[*] 使用与本地CPU核心数一致的工作线程来运行Spark
集群 spark://HOST:PORT Standalone模式。HOST:PORT指定了集群Master的地址与端口(缺省端口7077)
集群 mesos://HOST:PORT Mesos模式,依赖Mesos来调度Spark使用的资源。HOST:PORT指定了Mesos集群MesosClusterDispatcher的地址与端口(缺省端口5050)。 如果Mesos集群使用了ZooKeeper ZooKeeper,则URL需要写成:“mesos://zk://…”
集群 yarn Yarn模式,依赖Apache Yarn来调度Spark使用的资源。 Yarn集群配置信息要存放到$HADOOP_CONF_DIR或者$YARN_CONF_DIR目录下

Spark的运行流程以及相关概念

Spark的运行流程简述

  Spark应用在独立的集群中的一组进程上执行,Spark应用的Driver program生成SparkContext,SparkContext负责整个Spark应用运行时的协调,包括运行资源的申请、任务的分配和监控等。

  Spark应用运行的逻辑流程图如下:
  
Spark 2.1.0的运行模式

  1. Driver启动后生成SparkContext,SparkContext连接至Cluster Manager,这里的Cluster Manager可以是Standalone cluster manager、Mesos或YARN;
  2. Cluster Manager为Spark应用分配运行资源,即Worker节点上的Executor;
  3. Spark发送Spark应用(Jar文件或Python文件)至Executor;
  4. Spark分配Task给Executor,Executor执行Spark应用计算,存取Spark应用数据;
  5. SparkContext监控Task执行结果;
      
      

Spark相关概念

概念 说明
Application 用户编写的Spark应用程序,包含一个Driver程序和一组分布在集群中多个节点上运行的Executor程序
Application jar 包含了用户Spark Application可执行程序的Jar文件。用户也可以创建一个包含Spark Application可执行程序以及全部依赖包的所谓”uber jar”。用户的Jar文件中不应包含Hadoop或者是Spark的类库
Driver program 运行Spark Application的main()函数并且创建SparkContext的一段程序
SparkContext 包含了Spark Application的运行环境和配置,负责与ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭
Cluster manager Spark外部的服务,负责为Spark Application分配运行资源 (比如Standalone、Mesos、YARN)
Deploy mode 用来指定Driver程序在哪里运行。”cluster”模式下Driver程序运行在集群内部;”client”模式下Driver程序在提交Spark应用的进程中,而不是在集群内部被执行
Worker node Spark集群中任何用于运行Spark Application的节点。在Standalone模式中即通过start-slave.sh启动的工作节点;在Yarn模式中即NodeManager节点
Executor Spark Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一组Executor。
Task 被分配到某Executor上执行的任务单位
Job 包含若干Task的并行计算,由Spark Action(比如save、collect等)产生;在Driver的Log中可以查看Job的执行
Stage 每个Job会被拆分成多组Task集合,称之为Stage。与MapReduce中的map和reduce stage类似

Spark各运行模式的内部实现

本章内容引自:天戈朱 Spark(一): 基本架构及原理

Standalone独立集群运行模式

  Standalone模式使用Spark自带的资源调度框架,采用Master/Slaves的典型架构,选用ZooKeeper来实现Master的HA框架结构图如下:
  
Spark 2.1.0的运行模式

  该模式主要的节点有Client节点、Master节点和Worker节点。其中Driver既可以运行在Master节点上中,也可以运行在本地Client端。当用spark-shell交互式工具提交Spark的Job时,Driver在Master节点上运行;当使用spark-submit工具提交Job或者在Eclips、IDEA等开发平台上使用”new SparkConf.setManager(“spark://master:7077”)”方式运行Spark任务时,Driver是运行在本地Client端上的。
  
  运行过程如下图:

参考至:http://blog.csdn.net/gamer_gyt/article/details/51833681

Spark 2.1.0的运行模式

  1. SparkContext连接到Master,向Master注册并申请资源(CPU Core 和Memory)
  2. Master根据SparkContext的资源申请要求和Worker心跳周期内报告的信息决定在哪个Worker上分配资源,然后在该Worker上获取资源,然后启动StandaloneExecutorBackend;
  3. StandaloneExecutorBackend向SparkContext注册;
  4. SparkContext将Applicaiton代码发送给StandaloneExecutorBackend;并且SparkContext解析Applicaiton代码,构建DAG图,并提交给DAG Scheduler分解成Stage(当碰到Action操作时,就会催生Job;每个Job中含有1个或多个Stage,Stage一般在获取外部数据和shuffle之前产生),然后以Stage(或者称为TaskSet)提交给Task Scheduler,Task Scheduler负责将Task分配到相应的Worker,最后提交给StandaloneExecutorBackend执行;
  5. StandaloneExecutorBackend会建立Executor线程池,开始执行Task,并向SparkContext报告,直至Task完成
  6. 所有Task完成后,SparkContext向Master注销,释放资源

YARN-Client运行模式

  Spark on YARN模式根据Driver在集群中的位置分为两种模式:一种是YARN-Client模式,另一种是YARN-Cluster(或称为YARN-Standalone模式)。
  Yarn-Client模式中,Driver在客户端本地运行,这种模式可以使得Spark Application和客户端进行交互,因为Driver在客户端,所以可以通过webUI访问Driver的状态,默认是http://hadoop1:4040访问,而YARN通过http:// hadoop1:8088访问

  YARN-client的工作流程步骤为:
Spark 2.1.0的运行模式

  1. Spark Yarn Client向YARN的ResourceManager申请启动Application Master。同时在SparkContent初始化中将创建DAGScheduler和TASKScheduler等,由于我们选择的是Yarn-Client模式,程序会选择YarnClientClusterScheduler和YarnClientSchedulerBackend
  2. ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运行SparkContext,只与SparkContext进行联系进行资源的分派
  3. Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(Container)
  4. 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task
  5. client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向Driver汇报运行的状态和进度,以让Client随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务
  6. 应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己

YARN-Cluster运行模式

  在YARN-Cluster模式中,当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:
1. 第一个阶段是把Spark的Driver作为一个ApplicationMaster在YARN集群中先启动;
2. 第二个阶段是由ApplicationMaster创建应用程序,然后为它向ResourceManager申请资源,并启动Executor来运行Task,同时监控它的整个运行过程,直到运行完成

  YARN-cluster的工作流程分为以下几个步骤
Spark 2.1.0的运行模式

  1. Spark Yarn Client向YARN中提交应用程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运行的程序等
  2. ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,其中ApplicationMaster进行SparkContext等的初始化
  3. ApplicationMaster向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将采用轮询的方式通过RPC协议为各个任务申请资源,并监控它们的运行状态直到运行结束
  4. 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这一点和Standalone模式一样,只不过SparkContext在Spark Application中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler进行任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增加了对Executor的等待逻辑等
  5. ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务
  6. 应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭自己

Spark Client模式和Cluster模式的区别:

  • 理解YARN-Client和YARN-Cluster深层次的区别之前先清楚一个概念:Application Master。在YARN中,每个Application实例都有一个ApplicationMaster进程,它是Application启动的第一个容器。它负责和ResourceManager打交道并请求资源,获取资源之后告诉NodeManager为其启动Container。从深层次的含义讲YARN-Cluster和YARN-Client模式的区别其实就是ApplicationMaster进程的区别
  • YARN-Cluster模式下,Driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,因而YARN-Cluster模式不适合运行交互类型的作业
  • YARN-Client模式下,Application Master仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开