首页技术文章正文

什么是DAG?有向无环图的几种连贯关系讲解

更新时间:2020-12-29 来源:黑马程序员 浏览量:

1577370495235_学IT就到黑马程序员.gif

  DAG(Directed Acyclic Graph)叫做有向无环图,Spark中的RDD通过一系列的转换算子操作和行动算子操作形成了一个DAG。DAG是一种非常重要的图论数据结构。如果一个有向图无法从任意顶点出发经过若干条边回到该点,则这个图就是有向无环图,具体如图1所示。

图1 DAG有向无环图

  从图1可以看出,4→6→1→2是一条路径,4→6→5也是一条路径,并且图中不存在从顶点经过若干条边后能回到该点。在Spark中,有向无环图的连贯关系被用来表达RDD之间的依赖关系。其中,顶点表示RDD及产生该RDD的操作算子,有方向的边表示算子之间的相互转化。

  根据RDD之间依赖关系的不同可以将DAG划分成不同的Stage(调度阶段)。对于窄依赖来说,RDD分区的转换处理是在一个线程里完成,所以窄依赖会被Spark划分到同一个Stage中;而对于宽依赖来说,由于有Shuffle的存在,所以只能在父RDD处理完成后,下一个Stage才能开始接下来的计算,因此宽依赖是划分Stage的依据,当RDD进行转换操作,遇到宽依赖类型的转换操作时,就划为一个Stage。Stage的具体划分如图2所示。

图2 Stage的划分

  在图2中,创建了三个RDD的实例A、C以及E。当RDD的实例A做groupByKey转换操作生成B时,由于groupByKey转换操作属于宽依赖类型,所以就把实例A划分为一个Stage,如Stage1;当实例C做map转换操作生成D, D与实例E做union转换操作生成F,由于map和union转换操作都属于窄依赖类型,因此不进行Stage的划分,而是将C、D、E、F加入到同一个Stage中;当F与B进行join转换操作时,由于这时的join操作是非协同划分,所以属于宽依赖,因此会划分为一个Stage,如Stage2;剩下的B和G被划分为一个Stage,如Stage3。


猜你喜欢:

不同系统如何加载数据创建RDD?

Spark RDD是什么?RDD特征介绍

Scala下载和环境变量配置教程

黑马程序员大数据培训课程 

分享到:
在线咨询 我要报名
和我们在线交谈!