目录
1 DAG的介绍
DAG:全称为 Directed Acyclic Graph 中文为:有向无环图
在spark中,使用DAG来描述我们的计算逻辑。
2 Spark中的DAG
DAG是一组顶点与边的组合,顶点代表RDD,边代表对RDD的一系列操作。
DAG Sheduler根据RDD的不同transformation操作,讲DAG分为不同的stage,每个stage中又分为多个task。
3 DAG解决的问题
DAG的出现主要是为了解决MapReduce框架的局限性。MapReduce框架的局限性主要有以下两点:
(1)每个MapReduce操作都是独立的,hadoop框架也不知道接下来会有哪些MapReduce。
(2)每一步的输出结果,都会持久化到硬盘或者HDFS上。
当以上两个特点结合之后,我们就可以想象,如果在某些迭代的场景下,MapReduce 框架会对硬盘和 HDFS 的读写造成大量浪费。
而且每一步都是都是堵塞在上一步中,所以当我们处理复杂计算时,会需要很长的时间,但是数据量却不大。
所以Spark中引入了DAG,它可以优化计算计划,比如减少shuffle的计算。
4 DAG是怎么工作
4.1 工作流程
- 解释器是第一层。Spark 通过使用Scala解释器,来解释代码,并会对代码做一些修改。
- 在Spark控制台中输入代码时,Spark会创建一个 operator graph, 来记录各个操作。
- 当一个 RDD 的 Action 动作被调用时, Spark 就会把这个 operator graph 提交到 DAG scheduler 上。
- DAG Scheduler 会把 operator graph 分为各个 stage。 一个 stage 包含基于输入数据分区的task。DAG scheduler 会把各个操作连接在一起。
- 这些 Stage 将传递给 Task Scheduler。Task Scheduler 通过 cluster manager 启动任务。Stage 任务的依赖关系, task scheduler 是不知道的。
- 在 slave 机器上的 Worker 们执行 task。
4.2 注意点
RDD 的 transformation 分为两种:窄依赖(如map、filter),宽依赖(如reduceByKey)。 窄依赖不需要对分区数据进行 shuffle ,而宽依赖需要。所以窄依赖都会在一个 stage 中, 而宽依赖会作为 stage 的交界处。
每个 RDD 都维护一个 metadata 来指向一个或多个父节点的指针以及记录有关它与父节点的关系类型。