0%

spark基础-窄、宽依赖和任务划分

介绍了在spark中窄、宽依赖的划分以及任务划分

窄依赖和宽依赖

窄依赖

  • 每一个父RDD的Partition最多被子RDD的一个Partition使用
  • 独生子女:一个爹RDD只有一个子
Narrow-dependence.png

宽依赖

  • 每一个父RDD的Partition被子RDD的多个Partition使用,伴随shuffle
  • 超生:一个爹RDD有多个子
Wide.jpg

任务划分

RDD任务的切分,分为:Application、Job、Stage和Task,而且每一层都是1对n的关系

stage.jpeg

4个名词

  • Application:初始化一个SparkContext即生成一个Application
  • Job:一个Action算子就会生成一个Job
  • Stage:根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个宽依赖则划分一个Stage。
  • Task:Stage是一个TaskSet,将Stage划分的结果发送到不同的Executor执行即为一个Task。

个人理解

同样思考为啥要划分这么多东西?

  • Application

一个spark不止跑一个程序吧,所以一个程序一个 Application理所当然,进而生成一个AppMaster管理它。

  • Job

一个程序有许多转换算子和行动算子。只有执行到行动操作才真正改变数据,所以把截止到行动算子的算子划一个job合情合理吧。而且我们从源码也可以看到,执行一个行动操作,就会执行sc.runJob(...)

  • Stage

在一个Job中,有的可一路执行到宽依赖的,不需要shuffle写磁盘,按这个划分为一个Stage。

  • Task

在一个Stage中,我们观察最后一组分区,也就是shuffer前的,由于到这里都是可以一路执行的,所以按最后一组分区的个数,一个分区划一个Task。此时都划到分区了,自然不用划分了。