1.执行步骤
Spark具体采用3个步骤来生成物理执行计划:首先根据action()
操作顺序将应用划分为作业(job),然后根据每个job的逻辑处理流程
中的ShuffleDependency依赖关系,将job划分为执行阶段(stage)。最
后在每个stage中,根据最后生成的RDD的分区个数生成多个计算任务(
task),具体如下所述。
(1)根据action()操作顺序将应用划分为作业(job)。
如果应用程序中有很多action()操作,那么S
park会按照顺序为每个action()操作生成一个job,每个job的逻辑处理
流程也都是从输入数据到最后action()操作的。
(2)根据ShuffleDependency依赖关系将job划分为执行阶段(stage )。
对于每个job,从其最后的RDD(图4.3中连接results的MapPartitions
RDD)往前回溯整个逻辑处理流程,如果遇到NarrowDependency,则将
当前RDD的parent RDD纳入,并继续往前回溯。当遇到ShuffleDependen
cy时,停止回溯,将当前已经纳入的所有RDD按照其依赖关系建立一个
执行阶段,命名为stage i。
(3)根据分区计算将各个stage划分为计算任务(task)。
接下来的问题是如何生成计算任务。我们之前的想法是每个分区上的计算逻辑相同,而且是独立的,
因此每个分区上的计算可以独立成为一个task。Spark也采用了这个策略,
根据每个stage中最后一个RDD的分区个数决定生成task的个数。
标题
三个步骤生成物理执行计划:首先根据action操作顺序将应用划分为job,
然后根据每个job的逻辑处理流程中的shuffleDependency依赖,
将job划分为执行阶段stage;最后在每个stage中,根据最后生成的RDD的分区个数生成多个计算任务task,
(1)根据actionRDD将应用划分为job
(2)根据shuffle将job划分为stage
(3)根据分区计算将各个stage划分为task:根据每一个stage最后一个RDD算子的分区个数决定生成task的个数。