四个步骤:
1.构建DAG(调用RDD上的算子)
2.DAGScheduler将DAG切分Stage(切分的依据是Shuffle),将Stage中生成的Task以TaskSet的形式给TaskScheduler
3.TaskScheduler调度Task(根据资源情况将Task调度到相应的Executor中执行)
4.Executor接收Task,然后将Task丢入到线程池中执行
---------------------------------------------------------------------------
DAG描述多个RDD的转换过程,任务执行时,可以按照DAG的描述,执行真正的计算(数据被操作的一个过程)
DAG是有边界的:开始(通过SparkContext创建RDD),结束(出发Action,调用run Job就是一个完整的DAG就形成了)
一个RDD只是描述了数据计算过程中的一个环节,而DAG由一到多个RDD组成,描述了数据计算过程中的所有环节
一个Spark Application中有多少个DAG? 一到多个(取决于触发了多少个Action)
----------------------------------------------------------------------------
下一个DAG中可能产生多种不同类型和功能的Task,灰有不同的阶段
DAGScheduler:将一个DAG切分称一个到多个的Stage,切分的依据是Shuffle(宽依赖)
为什么要切分Stage?
一个复杂的业务逻辑(将多台机器具有相同属性的数据聚合到一台机器上:Shuffle)
如果有Shuffle,那么就意味着前面阶段产生的结果后,才能执行下一个阶段,下一个阶段的计算要依赖上一个阶段的数据。在同一个Stage中,会有多个算子,我们称其为pipeline(流水线)
----------------------------------------------------------------------------------
Shuffle的定义:
含义是洗牌,父RDD一个分区中的数据如果给了子RDD的多个分区(只要存在可能),就是Shuffle
shuffle会有网络传输数据,但有网络传输并不意味着就是shuffle