一、Spark中的基本概念
1、spark中的概念:
(1)Application:指的是用户编写的Spark应用程序,包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码。Spark应用程序,由一个或多个作业JOB组成
https://blog.csdn.net/liuxiangke0210/article/details/79687240
(2)Driver:提交的程序的main函数就是driver,driver里面包含SparkContext。即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常SparkContext所在的main函数代表Driver。
Spark applications run as independent sets of processes on a cluster, coordinated by the SparkContext
object in your main program (called the driver program).
Specifically, to run on a cluster, the SparkContext can connect to several types of cluster managers (either Spark’s own standalone cluster manager, Mesos or YARN), which allocate resources across applications. Once connected, Spark acquires executors on nodes in the cluster, which are processes that run computations and store data for your application. Next, it sends your application code (defined by JAR or Python files passed to SparkContext) to the executors. Finally, SparkContext sends tasks to the executors to run.
driver的主要功能:
- 运行应用程序的main函数
- 创建spark的上下文
- 划分RDD并生成有向无环图(DAGScheduler)
- 与spark中的其他组进行协调,协调资源等等(SchedulerBackend)
- 生成并发送task到executor(taskScheduler)
driver源码:https://blog.csdn.net/dpengwang/article/details/79058831
(3)Cluster Manager:资源管理器,指的是在集群上获取资源的外部服务,常用的有:Standalone,Spark原生的资源管理器,由Master负责资源的分配;Haddop Yarn,由Yarn中的ResearchManager负责资源的分配; Messos,由Messos中的Messos Master负责资源管理。
(3)Executor:某个Application运行在Worker节点上的一个进程,该进程负责运行某些task,并且负责将数据存在内存或者磁盘上。一个Application都有各自独立的一批Executor
在Spark on Yarn模式下,其进程名称为 CoarseGrainedExecutor Backend,一个CoarseGrainedExecutor Backend进程有且仅有一个executor对象,它负责将Task包装成taskRunner,并从线程池中抽取出一个空闲线程运行Task,这样,每个CoarseGrainedExecutorBackend能并行运行Task的数据就取决于分配给它的CPU的个数。
(4)Worker:集群中可以运行Application代码的节点。在Standalone模式中指的是通过slave文件配置的worker节点,在Spark on Yarn模式中指的就是NodeManager节点。
(5)Task:在Executor进程中执行任务的工作单元,多个Task组成一个Stage
(6)Job:包含多个Task组成的并行计算,是由Action行为触发的,每个Action的触发都会生成一个Job,一个 Job 会被拆分成stages,一个 stage由多个 task构成(Jobs–> Stages --> Tasks)。
(7)Stage:每个Job会被拆分很多组Task,作为一个TaskSet,其名称为Stage
(8)DAGScheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler,其划分Stage的依据是RDD之间的依赖关系
(9)TaskScheduler:将TaskSet提交给Worker(集群)运行,每个Executor运行什么Task就是在此处分配的。
2、job、stage、task的数量关系:
job数量:Application用户的程序是根据action算子进行触发job的,一个spark应用程序触发多个job;
stage数量:根据宽窄依赖来划分stage,一个job包含多个stage,stage就是taskset,即task集合,一个stage包含多个task;
task数量:task数量与RDD分区是对应的,而RDD分区可以通过sparkcontext设置、代码中指定并行度、重新分配分区执行。
二、Spark的运行流程
1、Spark的运行流程
(1)构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源;
(2)资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上;
(3)SparkContext构建成DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task
(4)Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor。
(5)Task在Executor上运行,运行完毕释放所有资源。
https://www.cnblogs.com/frankdeng/p/9301485.html
三、spark划分DAG
spark根据宽依赖进行DAG视图的划分。
1、窄依赖:
每个父RDD的partition 最多被一个子RDD的 partition使用。
窄依赖分为两类:第一类是一对一的依赖关系,在Spark中用OneToOneDependency来表示父RDD与子RDD的依赖关系是一对一的依赖关系,如map、filter、join with inputs co-partitioned;第二类是范围依赖关系,在Spark中用RangeDependency表示,表示父RDD与子RDD的一对一的范围内依赖关系,如union。
2、宽依赖:
每个父 RDD 的patition 都被多个子 RDD的 patition 使用。是一种会导致计算时产生 shuffle 操作的 RDD 操作。
3、DAG生成机制:
DAG的目的就是对任务进行排队执行。
DAG在图论中指的是有向无环图,而在spark中,由于计算过程具有先后顺序,也就是说任务需要进行排队形成一个队列的任务集合,这个队列的任务集合就是DAG图。
DAG生成机制关键就是对stage的划分,划分stage的依据就是RDD的依赖关系,对于窄依赖,RDD之间的数据不需要进行shuffle,多个数据处理只需要在同一台机器的内存中就能完成计算,因此可以将其划分到同一个stage当中。而宽依赖,涉及到shuffle,必须等到父RDD完成计算,才能进行下一步计算,因此会在宽依赖处进行stage的切分。
在Spark中,DAG生成的流程关键在于回溯,在程序提交后,高层调度器将所有的RDD看成是一个Stage,然后对此Stage进行从后往前的回溯,遇到Shuffle就断开,遇到窄依赖,则归并到同一个Stage。等到所有的步骤回溯完成,便生成一个DAG图。
参考博客:https://blog.csdn.net/newchitu/article/details/92797090#一、窄依赖解析