spark调度原理描述
spark调度的几个概念
集群
一个spark集群可以同时运行多个spark应用
应用
1、main方法、spark-shell、spark-submit能够运行的spark程序
2、可以理解为创建SparkContext的driver运行的程序
3、一个spark应用可以运行多个job
job
job对应应用中的行动算子,每执行一个行动算子都会提交一个job
一个job由多个stage(阶段)组成
stage阶段
一个宽依赖做一次阶段的划分
宽依赖就是shuffle依赖,发生了shuffle的操作都是宽依赖
以下算子都会引发shuffle
**Bykey、repartition、groupBy、SortBy、join
阶段的个数 = 宽依赖的个数 + 1
一个stage由多个task组成
task任务
task是每个并行的计算过程,并运行于executor(这里需要注意和executor的关系)
task是真正处理数据的动作
spark调度流程示意图
如上图所示:
1、阶段1中,虽然有一次map算子的调用,并生成了新的RDD,但是并没有产生shuffle,所以在同一阶段
2、阶段1中有两个分区,所以会有两个task并行运行于executor
注意:task对应着线程,executor对应在集群实例节点上的进程,对比与hadoop中mapReduce中的maptask或reducetask(进程),task线程会轻很多,而executor是启动集群就创建好的,task运行在哪个executor中需要driver进行调度
每个task处理一个partition分区
3、阶段1没运行完,阶段2不可以开始
4、上图对应着一个DAG有向无环图,对应着一次行动算子的调用,一个job
5、当task被提交到executor之后,会根据executor可用的cpu核数,决定一个executor中最多同时运行多少个task
分布式计算的精髓
分布式计算的精髓在于,如何把抽象的计算流图,转化为实实在在的分布式计算任务,然后以并行计算的方式交付执行。
这也是spark最牛的地方:操作分布式的数据尽量感知不到是分布式的