在土豆车间洗牌
读者不禁要问:DAGScheduler是如何判断RDD之间的转换是否会洗牌的?这位读者说,“前一份文件说,接线员半天是RDD之间转换的关键 。是不是要根据运营商来判断是否会发生洗牌?”你真的猜错了 。运算符和Shuffle之间没有对应关系 。以连接操作符为例 。在大多数情况下 , 连接会引入洗牌;;但是在同位连接中 , 当左右表的数据分布一致时 , 就不会发生Shuffle 。所以,你看,DAGScheduler真的不能依靠运营商本身来判断是否发生洗牌 。要回答这个问题 , 我们还是要回到上一篇文献《内存计算的起源——RDD》中介绍RDD时提到的五个属性 。
名称成员类型属性含义相关性变量生成RDD所依赖的父RDD 。Compute方法生成RDD的计算接口分区变量 。RDD的所有数据片段 。实体划分器方法划分数据片段的规则 。数据片段的可变物理位置偏好
RDD的五种属性及其含义
其中,第一种属性依赖可以细分为窄依赖和洗牌依赖 。窄依赖(NarrowDependency)也叫“窄依赖” , 是指RDD所依赖的数据不需要分布,基于当前已有的数据切片就可以实现compute attribute封装的功能 。另一方面,ShuffleDependency意味着RDD所依赖的数据碎片需要分布在集群中 , 然后才能执行RDD的compute函数来完成计算 。因此,RDD之间的转换是否是无序的取决于子RDD的依赖类型 。如果依赖类型是ShuffleDependency , 那么DAGScheduler决定RDD和RDD之间的转换将引入Shuffle 。在回溯到DAG的过程中,一旦DAGScheduler发现RDD的依赖类型是ShuffleDependency,它将依次执行以下三个操作:
沿着 Shuffle 边界的子 RDD 方向创建新的 Stage 对象把新建的 Stage 注册到 DAGScheduler 的 stages 系列字典中,这些字典用于存储、记录与 Stage 有关的状态和元信息 , 以备后用沿着当前 RDD 的父 RDD 遵循广度优先搜索算法继续回溯 DAG
以土豆工坊为例 。其尾节点flavouredBakedChipsRDD依赖于两个父RDD bakedChipsRDD和flavoursRDD , 依赖类型为ShuffleDependency 。然后,根据DAGScheduler的执行逻辑,此时将执行以下三个具体操作:
DAGScheduler在DAG过程中遇到ShuffleDependency时,会回撤主操作流程 。
DAGScheduler沿着尾节点回溯并划分为stage0 。
完成第一阶段(stage0)的创建和注册后,DAGScheduler继续向bakedChipsRDD方向回溯 。当我们沿着这条路跑的时候,我们的DAGScheduler向导惊讶地发现:“我去!去马平川的一路上,风景很好,站与站之间没有障碍,交通也很顺畅 。真是好地形!”——沿路遇到的所有RDD(Bakedchipsrdd,chipsrdd,cleanedPotatosRDD,PotatosRDD)都是窄依赖 。
回溯结束时,DAGScheduler也会重复上述三个步骤 。根据DAGScheduler以Shuffle为界划分阶段的原理,将沿途所有RDD归为同一阶段,暂记为stage1 。值得一提的是,Stage对象的rdd属性对应的数据类型是RDD[] , 而不是列表[RDD[]] 。对于逻辑上包含多个RDD的阶段,其RDD属性存储路径末端的RDD节点,在我们的例子中是bakedChipsRDD 。
DAGScheduler沿着bakedChipsRDD方向回溯,划分stage1 。
勤奋的DAGScheduler,在成功创建stage1之后,还在不忘初心,牢记使命,继续向未探索的路线前进 。从上图中,我们可以清楚地看到 , flavoursRDD方向的路径保留在整个地形中,不包含在DAGScheduler的视图中 。我们的DAGScheduler向导记忆力很好 。早在stage0划分的时候 , 他就在笔记本(栈)上写下:“这个路口有个岔口 。先沿着bakedChipsRDD走 , 再回头沿着flavoursRDD探索 。”记住,记?。贝耸保?向导拿出之前的笔记本,用横线划掉了bakedChipsRDD方向的路径——表示这个方向的路径已经探索过了,然后沿着flavoursRDD方向大步走去 。一脚下去,发现:“我去!结束了!” , 然后按照通常的“三招一套”流程——创建阶段、注册阶段、继续回溯 。随着DAGScheduler创建最后一个阶段:stage2,地形上的所有路径都已被探索 。
DAGScheduler创建最后一个阶段:阶段2
到目前为止,我们的向导几乎断了腿,按照首尾相连的顺序搜索了整个地形,最后把地形划分为三个战略阶段 。那么,问题来了 。指南划分的三个区域有什么用?DAGScheduler他老爸一直这样跑 。有什么意义?如前所述,DAGScheduler的核心职责是将抽象的DAG计算图转化为可以并行计算的具体分布式任务 。追溯到DAG和创建Stage只是这个核心职责的第一步 。DAGScheduler以Stage(TaskSet)作为任务调度的粒度 , 与TaskScheduler、SchedulerBackend等众多bosses协同作战,运筹帷幄,调兵遣将 。不过,毕竟这篇文章的主题是DAG,距离星火调度系统的核心还有一段距离,所以暂且在这里挖个坑,稍后再单独打开(星火调度系统) , 讲讲几位大佬之间的趣闻轶事 。填坑的路很长,修远,我会上下挖掘这个坑 。
推荐阅读
- 上古卷轴5怎么安装mod
- car怎么读 可以怎么解释呢
- 春羽叶子发黄怎么办 春羽叶子发黄的解决方法
- 《文明6》卡顿问题解决心得分享
- 学富五车的近义词是什么 学富五车有哪些近义词
- 衣服爱起球怎么清洗比较好 衣服老爱起球该怎么处理
- 百分之90怀疑宫外孕 宫外孕有什么症状前期
- 魔兽怀旧服采矿1—300怎么冲
- 断夜奶的方法