大数据 T5 Spark Architecture,有向无环图(DAG)与懒启动

464 阅读4分钟

专栏 大数据 数据处理原理
如果对你有帮助求个赞或者关注,谢谢谢谢。

之前讲过,在大数据处理过程中,经常会出现多个Map和Reduce连接在一起的情况(map1 -> map2 -> map3 -> ... -> reduce1 -> ...).这意味着后面的输入依赖于前一步的输出。在Spark中,任务被用DAG的形式来表示,并且使用DAG的一些数学特性进行运行优化。

什么是DAG(Directed Acyclic Execution Graph)

DAG代表有向无环图(Directed Acyclic Graph)。它是一个由节点和有向边组成的图结构,其中每条边都有一个方向,并且不存在任何形式的环路。

在DAG中,节点表示任务、操作或事件,有向边表示任务之间的依赖关系。如果存在一条从节点A指向节点B的有向边,那么就意味着节点A必须在节点B之前执行或完成。因此,DAG表示了任务或操作之间的顺序关系。

Spark中的DAG

首先,Spark将大任务分为不同的节点,然后以DAG的形式讲这些任务表示出来。然后Spark scheduler会对DAG进行分析,查看哪些任务可以并行执行。通过这种方式,将任务分为不同的阶段,每个阶段内的各个任务可以并行计算,后一个阶段必须依靠前一阶段的结果。

image.png

由于这部分内容牵扯到数论的知识,所以只列出一些概括性的内容。

  1. Spark使用DAG来确定作业中操作的执行顺序,以最大程度地提高作业的执行效率。它可以根据依赖关系和操作之间的数据流来安排和调度任务的执行顺序,以最小化数据移动和重复计算。
  2. Spark通过DAG来识别操作之间的依赖关系。如果两个操作之间存在依赖,且需要在两个操作之间传输数据,则称为宽依赖(Wide Dependency)。如果两个操作之间没有数据传输,或者仅需要传输部分数据,则称为窄依赖(Narrow Dependency)。Spark利用这些依赖关系来确定操作的划分和执行策略。
  3. 通过分析DAG中的操作和它们之间的依赖关系,Spark可以进行各种优化,如操作融合、谓词下推、分区剪枝等,以提高作业的执行性能。

懒启动(Lazy execution)

比如,在一个程序中,我们同时写了两个MapReduce算法(MR1,MR2),他们具有不同的功能,在运行过程中,我们只想使用MR1,但是MR2的代码和MR1在一起。正常情况下,我们代码是一行行从上到下进行执行的,这意味着如果碰到了MR2的代码,仍然要把这一行代码执行完再去下一步(即使我们不需要MR2运行)。

但是懒启动不是,Spark会先将两个算法MR1和MR2转化为DAG,如下图。这个时候他们的实际任务(读取或者处理数据)并不会被执行。直到用户下达了一个命令(action:比如我需要MR1的某种结果)。然后Spark scheduler通过DAG判断哪些任务需要被执行,执行顺序等。通过这样就能保证只有MR1相关的操作被执行避免了资源浪费。

image.png Spark中有两种操作,分别为transformation和action,上述的用户下达的命令就成问action,比如collection(),用来收集结果。transformation就代表着一些操作(Map,Reduce或者其他操作),这些操作不是立即执行,而是被action触发。

image.png

Spark Architecture

image.png 上图为Spark的主要组成部件。

掘金上也有人写了一个更为详细的帖子 # Spark学习(一)——运行模式与运行流程.感兴趣可以进行查看。下面简单总结一下与Hadoop的区别。

Transformation 与 action

Transformation: 将一个RDD转为另一种RDD的过程,Map,Reduce都是转换的过程。

RDD --- Transformation ---> RDD

Action:返回RDD或者向磁盘写入的操作。

Spark提供了很多函数,分别为transformation与Action,这里不介绍他们每个函数的功能与返回值,因为手册上有更详细且权威的解释。

接下来呢

给一个可以运行的Spark程序,并且解释运行过程。