首先介绍一下?Spark?的资源管理架构。Spark?集群考虑到了未来对接一些更强大的资源管理系统(如?Yarn、Mesos?等),没有在资源管理的设计上对外封闭,所以Spark?架构设计时将资源管理抽象出了一层,通过这种抽象能够构建一种插件式的资源管理模块。
?
见上图,Master?是?Spark?的 主控节点,在实际的生产环境中会有多个?Master,只有一个?Master?处于?active?状态。Worker?是?Spark?的工作节点,向?Master?汇报自身的资源、Executeor?执行状态的改变,并接受?Master?的命令启动?Executor?或?Driver。Driver?是应用程序的驱动程序,每个应用包括许多小任务,Driver?负责推动这些小任务的有序执行。Executor?是?Spark?的工作进程,由?Worker 监管,负责具体任务的执行。
?
整个 Spark 集群中,分为 Master 节点与 worker 节点,同时一个集群有多个master节点和多个worker节点。
一台机器可以同时作为master和worker节点,比如有四台机器,可以选择一台设置为master节点,然后剩下三台设为worker节点,也可以把四台都设为worker节点,这种情况下,有一个机器既是master节点又是worker节点。
Appliction都是指用户编写的Spark应用程序,其中包括一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码
当我们在代码中执行了cache/persist等持久化操作时,根据我们选择的持久化级别的不同,每个task计算出来的数据也会保存到Executor进程的内存或者所在节点的磁盘文件中。
因此Executor的内存主要分为三块:第一块是让task执行我们自己编写的代码时使用,默认是占Executor总内存的20%;第二块是让task通过shuffle过程拉取了上一个stage的task的输出后,进行聚合等操作时使用,默认也是占Executor总内存的20%;第三块是让RDD持久化时使用,默认占Executor总内存的60%。
task的执行速度是跟每个Executor进程的CPU core数量有直接关系的。一个CPU core同一时间只能执行一个线程。而每个Executor进程上分配到的多个task,都是以每个task一条线程的方式,多线程并发运行的。如果CPU core数量比较充足,而且分配到的task数量比较合理,那么通常来说,可以比较快速和高效地执行完这些task线程。
集群管理器,指的是在集群上获取资源的外部服务。目前有三种类型:
在集群不是特别大,并且没有mapReduce和Spark同时运行的需求的情况下,用Standalone模式效率最高。
被送到某个Executor上的工作单元,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责
包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Application中往往会产生多个Job。总之Job=多个stage
每个Job会被拆分成多组Task, 作为一个TaskSet, 其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage)两种,Stage的边界就是发生shuffle的地方。总之Stage=多个同种task
根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TASkScheduler。 其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法
将TaskSET提交给worker运行,每个Executor运行什么Task就是在此处分配的。TaskScheduler维护所有TaskSet,当Executor向Driver发生心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护着所有Task的运行标签,重试失败的Task。下图展示了TaskScheduler的作用:
?
在不同运行模式中任务调度器具体为:
第一步:当我们提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程。driver进程就是应用的main()函数并且构建sparkContext对象,根据使用的部署模式不同,Driver进程可能在本地启动,也可能在集群中某个工作节点上启动。driver本身会根据我们设置的参数占有一定的资源(主要指cpu core和memory)。
第二步:Driver进程首先会向集群管理器(standalone、yarn,mesos)申请spark应用所需的资源,这里的资源指的就是Executor进程。然后集群管理器会根据spark应用所设置的参数在各个worker上分配一定数量的executor,每个executor都占用一定数量的cpu和memory。
第三步:在得到申请的应用所需资源以后,driver就开始调度和执行我们编写的应用代码。driver进程会将我们编写的spark应用代码拆分成多个stage,每个stage执行一部分代码片段,并为每个stage创建一批task,然后将这些tasks分配到各个executor中执行,task是最小的计算单元,负责执行一模一样的计算逻辑(也就是我们自己编写的某个代码片段),只是每个task处理的数据不同而已。
第四步:一个stage的所有task都执行完毕之后,会在各个节点本地的磁盘文件中写入计算中间结果,然后Driver就会调度运行下一个stage。下一个stage的task的输入数据就是上一个stage输出的中间结果。如此循环往复,直到将我们自己编写的代码逻辑全部执行完,并且计算完所有的数据,得到我们想要的结果为止。运行完成后,会释放所有资源。
Spark on Yarn ,了解一下????????
本文地址:https://blog.csdn.net/yawei_liu1688/article/details/111958747