Spark物理执行计划生成方法
1 执行步骤
Spark分3步来生成物理执行计划首先根据action()操作顺序将应用分为job,然后根据每个job的逻辑处理流程中的ShuffleDependency依赖关系将job划分为stage,最后在每个stage中,根据最后生成的RDD的分区个数生成多个task。
2 相关问题
2.1 job、stage和task的计算顺序
job的提交时间与action()被调用的时间有关,当应用程序执行到rdd.action()时,就会立刻将rdd.action()形成的job提交给Spark。job的逻辑处理流程实际上是一个DAG图,经过stage划分后,仍然是DAG图形状,每个stage的输入要么是job的输入数据,要么是上游stage的输出结果。因此,计算顺序从包含输入数据的stage开始,从前到后依次执行,仅当上游的stage都执行完成后,在执行下游的stage。stage中的每个task都是独立而且同构的,可以并行,没有先后之分。
2.2 task内部数据的存储与计算问题(流水线问题)
窄依赖下,并且单条数据操作,可以使用流水线式操作
如果需要一次性读取多条数据后才能计算,“流水线”式计算退化到“计算-回收”模式,每执行完一个操作,回收之前的中间结果。
Spark采用“流水线”式计算来提高task的执行效率,减少内存使用量,这也是Spark可以在有限内存中处理大规模数据的原因。然而,对于某些需要聚合中间结果的操作,还需要占用一定的内存空间,也会在一定程度上影响流水线计算的效率。
2.3 task之间的数据传递和计算问题
Shuffle Write和Shuffle Read问题,取决于Shuffle方式。