Spark中的有向无环图(DAG:Directed Acyclic Graph)

 

DAG是什么

以文件中单词出现频次为例,来介绍DAG

Spark中的有向无环图(DAG:Directed Acyclic Graph)_第1张图片

 

从上图看出,一个Transform操作(即懒加载方法)转换成一个RDD,RDD之间存在依赖关系,最后通过一个ACTION操作函数对数据进行计算。我们把RDD间组成的计算链,称为DAG(有向无环图)。通过RDD间的依赖关系,可以跟踪依赖链找到该分区的父分区,重新计算该分区数据,采用这种逆推父分区,恢复数据的方式,实现了RDD的容错机制。

 

RDD间存在什么样的依赖关系

RDD之间的依赖关系分为窄依赖和宽依赖

窄依赖:父分区和子分区存在一对一的关系,比如:map 、filter、union函数。不会引入Shuffle的概念,不会发生磁盘IO读写。DAG中连续连续多个窄依赖,会放到一起执行。

宽依赖:父分区和子分区存在多对多的关系,比如groupBy、sortByKey等带分组功能的一些懒加载函数。引入了Shuffle的概念,会发生磁盘IO读写。宽依赖数据丢失时,可以从Shuffle临时文件恢复数据

 

Spark中的有向无环图(DAG:Directed Acyclic Graph)_第2张图片

DAG的State是什么

Spark执行JOB任务(一个Action操作对应一个JOB任务),根据依赖关系,将DAG划分为不同的阶段。下面是划分流程

  1.  Spark在执行Transformation类型操作时,都不会立即执行,而是懒计算
  2.  执行若干步Transformation类型操作后,一旦遇到Action操作,才会真正触发计算
  3.  划分时,从当前Action往前回溯,如果遇到的是窄依赖则应用流水线优化(即连续的多个窄依赖会放到一起执行),继续往前找,直到遇到一个宽依赖
  4.  宽依赖要进行Shuffle,不执行流水线优化,所以将这一阶段执行过程组装为一个State
  5.  再从当前宽依赖开始向前找,重复刚才的步骤,从而将整个DAG划分为若干State

Spark中的有向无环图(DAG:Directed Acyclic Graph)_第3张图片

 

Task:对应一个分区,一个Task就是一个分区。比如:RDD1有2个分区,即2个Task。

上图存在RDD1->RDD3的两个Task(流水线优化成了2个Task)和RDD4的两个Task,总共4个Task

Spark中的有向无环图(DAG:Directed Acyclic Graph)_第4张图片

 

你可能感兴趣的:(开发工具,大数据,spark)