开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:Spark 原理_物理图_Stage 划分】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/12023
Spark 原理_物理图_Stage 划分
内容简介
一、回顾 task 设计
二、如何划分依据
三、如何划分阶段
一、回顾
上节我们学习了 Task 设计的两个想法,这两个想法都比较偏颇,可以分阶段,采用数据流动的模型进行设计,本节主要学习的内容就是阶段怎么划分:阶段+task 就是执行 RDD 的执行者
// task 在遇到 shuffle 时没有办法,必须等前面的所有任务执行完
二、如何划分数据?
首先要了解问题,红框位置,reducerdd 中的task 基于前面所有分区的 task 执行,一个分区的数据,依赖于前面所有分区的数据,那么就没有办法处理了
1.为减少执行任务,减少数据暂存和交换的机会,所以需要创建管道,让数据沿着管道流动,其实也就是原先每个 RDD 都有一组 Task,现在改为所有的 RDD 共用一组 task,但也会出现问题,下图红框区域:
如果要计算 reduceRDD 中 p1 的数据,则要获取 tupleRDD 中所有分区的数据
2.我们可以将其划分为两个阶段,如下图所示
这里在 shuffle 处,必须断开管道,进行数据交换,交换过后,继续流动,所以整个流程可以变为如下
将其划分为两个阶段,这样 task 就可以计算对应 RDD 中的分区,
将左边所有分区的 p1 都放在一个 task 中执行,将所有的 p2 都放在同一个 task 中执行,将 tuplerdd 与 reducerdd 之间断开,这样就会先执行左边的阶段,执行右边的阶段
把 task 断开成两个部分,task4 就可以从 task1,2,3中获取数据,后 task4 又作为管道,继续让数据在其中流动
3.但是还有一个问题,说断开就直接断开吗?不用打招呼?这个断开即没有道理,也没有规则,所以可以为这个断开增加一个概念叫做阶段,按照阶段断开,阶段的英文叫做 stage,str1rdd 依赖 reducerdd 的分区,reducerdd 依赖于tuplerdd,而它们之间是 shuffle 关系,所以将其断开,继续想左,都是窄依赖,如下:
三、所以划分阶段的本身就是设置断开的规则,那么该如何划分阶段呢?
1.第一步,从最后一个 RDD,也就是逻辑图中最右边的 RDD 开始,向前滑动 stage 的范围,为 stage0
2.第二步,遇到 shuffledependency 断开 stage ,从下一个 RDD 开始创建新的 stage,为stage1
3.第三步,新的 stage 按照同样的规则继续滑动,指导包裹所有的 RDD
总结来看,就是针对与宽窄依赖来判断,一个 stage 中只有窄依赖,因为只有窄依赖才能形成数据的 pipeline
如果要进行 shuffle 的话,数据是流不过去的,必须要拷贝和拉取,所以遇到 RDD 宽依赖的两个 RDD 时,要切断这两个 RDD 的 stage
阶段怎么划分:阶段+task 就是执行 RDD 的执行者