基本术语:
Standalone模式下存在的角色:
Client:客户端进程,负责提交作业到Master
Master:Standalone模式下的`主控节点`,负责接收client提交的作业,管理worker,并命令worker启动Driver和Executor。
Worker:Standalone模式下slave节点上的`守护进程`,负责管理本节点的资源,定期向Master汇报心跳,接收Master的命令,启动Driver和Executor。
Driver:一个Spark作业运行时包括一个Driver进程,也是作业的`主进程`,负责作业的解析、生成Stage并调度Task到Executor。包括GAGScheduler,TaskScheduler。
Executor:即作业真正执行的地方,一个集群一般包含多个Executor,每个Executor接收Driver的命令Launch Task,一个Executor可以执行一个到多个Task。
作业相关的名词解释
Stage:一个Spark作业一般包含一到多个Stage
Task:一个Stage包含一个到多个Task,通过多个Task实现并行运行的功能。
DAGScheduler:实现将Spark作业分解成一个到多个Stage,每个Stage根据RDD的分区个数决定Task的个数,然后生成相应的Task set放到TaskScheduler中。
TaskScheduler:实现Task分配到Executor上执行。
将这些术语串起来的运行层次图如下:
Job=多个Stage,Stage=多个同种
Task,Task分为ShuffleMapTask和ResultTask,Dependency分为ShuffleDependency和NarrowDependency。
Spark运行模式:
Standalone模式架构图:
该模式主要的节点有client节点、Master节点和worker节点。其中Driver既可以运行在Master节点上,也可以运行在Client节点端。
当用spark-shell交互式工具提交Spark的job时,Driver在Master节点上运行;
当使用spark-submit工具提交job或者在eclipse、IDEA等平台上使用“new SparkConf.setManager(“spark://master:7077”)”方式运行Spark任务时,Driver是运行在本地Client端上的。
运行过程图:(参考博客)
- SparkContext连接到Master,想Master注册并申请资源(CPU Core 和Memory)
- Master根据SparkContext的资源申请要求和worker心跳周期内报告的信息决定在哪个worker上分配资源,然后在该Worker上获取资源,然后启动StandaloneExecutorBackend
- StandaloneExecutorBackend向SparkContext注册
- 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执行;
- StandaloneExecutorBackend会建立Executor线程池,开始执行Task,并向SparkContext报告,直至Task完成
所有Task完成后,SparkContext向Master注销,释放资源StandaloneExecutorBackend会建立Executor线程池,开始执行Task,并向SparkContext报告,直至Task完成; - 所有Task完成后,SparkContext向Master注销,释放资源;
Yarn
Spark On Yarn模式根据Driver在集群中的位置分为两种模式:一种是YARN-Client模式,另一种是YARN-Cluster(或称为YARN-Client)
在此以YARN-Cluster为例:
- Spark Yarn Client向YARN中提交应用程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运行的程序等
- ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,其中ApplicationMaster进行SparkContext等的初始化
- ApplicationMaster向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将采用轮询的方式通过RPC协议为各个任务申请资源,并监控它们的运行状态直到运行结束
- 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这一点和Standalone模式一样,只不过SparkContext在Spark Application中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler进行任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增加了对Executor的等待逻辑等
- ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务
- 应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭自己