spark中dag的介绍

本文介绍了Spark中DAG(有向无环图)的相关知识。DAG由顶点和边组成,顶点代表RDD,边代表对RDD的操作。它解决了Hadoop MapReduce框架的局限性,可优化计算计划。还阐述了其工作流程,以及RDD转换的窄依赖和宽依赖特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

什么是DAG

DAG 解决了什么问题

DAG 是怎么工作的

工作流程

注意点


DAG,全称 Directed Acyclic Graph, 中文为:有向无环图。

在 Spark 中, 使用 DAG 来描述我们的计算逻辑。


什么是DAG

DAG 是一组顶点和边的组合。顶点代表了 RDD, 边代表了对 RDD 的一系列操作。

DAG Scheduler 会根据 RDD 的 transformation 动作,将 DAG 分为不同的 stage,每个 stage 中分为多个 task,这些 task 可以并行运行。


DAG 解决了什么问题

DAG 的出现主要是为了解决 Hadoop MapReduce 框架的局限性。那么 MapReduce 有什么局限性呢?

主要有两个:

  • 每个 MapReduce 操作都是相互独立的,HADOOP不知道接下来会有哪些Map Reduce。
  • 每一步的输出结果,都会持久化到硬盘或者 HDFS 上。

当以上两个特点结合之后,我们就可以想象,如果在某些迭代的场景下,MapReduce 框架会对硬盘和 HDFS 的读写造成大量浪费。

而且每一步都是堵塞在上一步中,所以当我们处理复杂计算时,会需要很长时间,但是数据量却不大。

所以 Spark 中引入了 DAG,它可以优化计算计划,比如减少 shuffle 数据。


DAG 是怎么工作的

工作流程

  1. 解释器是第一层。Spark 通过使用Scala解释器,来解释代码,并会对代码做一些修改。
  2. 在Spark控制台中输入代码时,Spark会创建一个 operator graph, 来记录各个操作。
  3. 当一个 RDD 的 Action 动作被调用时, Spark 就会把这个 operator graph 提交到 DAG scheduler 上。
  4. DAG Scheduler 会把 operator graph 分为各个 stage。 一个 stage 包含基于输入数据分区的task。DAG scheduler 会把各个操作连接在一起。
  5. 这些 Stage 将传递给 Task Scheduler。Task Scheduler 通过 cluster manager 启动任务。Stage 任务的依赖关系, task scheduler 是不知道的。
  6. 在 slave 机器上的 Worker 们执行 task。

注意点

RDD 的 transformation 分为两种:窄依赖(如map、filter),宽依赖(如reduceByKey)。 窄依赖不需要对分区数据进行 shuffle ,而宽依赖需要。所以窄依赖都会在一个 stage 中, 而宽依赖会作为 stage 的交界处。

每个 RDD 都维护一个 metadata 来指向一个或多个父节点的指针以及记录有关它与父节点的关系类型。

 

备注:原文地址

参考地址

### SparkDAG 的概念 DAG(Directed Acyclic Graph),即有向无环图,在 Spark 中用于描述计算逻辑。DAG 描述了 Spark 作业中各个任务之间的依赖关系,使得 Spark 能够高效地调度和执行这些任务,充分利用集群资源,从而实现高性能的数据处理[^2]。 ### SparkDAG 的工作原理 当一个 Spark 应用程序启动时,所有的转换操作会被记录下来并形成一个由 RDD 组成的血缘关系链。只有遇到行动操作时,才会触发实际的任务提交过程。此时,Spark 会分析这个血缘关系链,并将其转化为多个阶段(Stage)。每个 Stage 内部包含了若干个 Task,而 Stages 之间则按照宽依赖来划分边界。最终形成的 DAG 将指导整个计算流程的有效执行[^3]。 具体来说: - **DAGScheduler**:负责将用户的逻辑计划转化成为物理执行计划中的多个 Stage,并进一步拆解为具体的 Tasks。 - **TaskScheduler**:接收来自 DAGScheduler 构建好的 Stage 后,管理这些 Tasks 在 Worker Node 上的具体运行情况,包括分配资源、监控进度等。 ```python from pyspark import SparkConf, SparkContext conf = SparkConf().setAppName("example") sc = SparkContext(conf=conf) rdd1 = sc.parallelize([1, 2, 3]) rdd2 = rdd1.map(lambda x: x * 2).filter(lambda x: x > 4) result = rdd2.collect() print(result) ``` 在这个例子中,`map()` 和 `filter()` 是转换操作,它们不会立即被执行;直到调用了行动操作 `collect()` 才真正开始构建和优化对应的 DAG 图形表示形式,进而完成数据集上的所有指定变换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值