我们来回顾一下导游的心路历程 。首先 , DAGScheduler沿着DAG的尾节点北上,沿途判断每个RDD节点的依赖属性 。之后,如果确定RDD的依赖属性是NarrowDependency,DAGScheduler将继续向前回溯;如果RDD的依赖是ShuffleDependency,DAGScheduler将启动“三动一集”移动,创建阶段,注册阶段并继续回溯 。因此,何时切割DAG并生成新阶段由RDD的依赖类型决定,并且DAGScheduler仅当且仅当RDD的依赖是ShuffleDependency时才会创建新阶段 。
【sx是什么意思 shuffle什么意思】如果你喜欢提问 , 你一定会问 , “DAGScheduler怎么知道RDD依赖哪种类型?他怎么知道RDD的依赖是狭义依赖还是洗牌依赖?”要回答这个问题,我们必须回到RDD的五个属性 , 但这次是分裂者 。还记得这个属性吗?Partitioner是RDD的划分器,定义了RDD数据分片的划分规则 。它决定了RDD的数据碎片如何分布在分布式集群中 。这个属性很重要 , 后面介绍Shuffle的时候会提到 。DAGScheduler通过划分器来确定每个RDD的依赖类型 。具体地 , 如果子RDD的划分器与父RDD的划分器一致,则DAGScheduler确定子RDD对父RDD的依赖属于窄依赖 。相反 , 如果两个partitioner不一致 , 即分区规则不同(不同的分区规则意味着必须有数据的“洗牌” , 即Shuffle),那么DAGScheduler确定子对父的依赖是ShuffleDependency 。至此,DAGScheduler对DAG的划分逻辑暂时可以告一段落了 。原理说了,举了例子 。还缺什么?对!代码 。
给我看看代码古人云:“光说不练 。”我们用一个小例子来说明DAG和Stage的关系 。或者使用上一章“内存计算的起源——RDD”中的WordCount来效仿 。该文件的内容如下 。
样本文件内容
代码没有改变:
字数统计示例代码
虽然文件的内容和代码没有变,但是我们观察问题的角度变了 。这一次 , 我们关注的是DAG中阶段的划分以及阶段之间的关系 。RDD的toDebugString函数可以让我们看到DAG的组成和阶段的划分 , 如下图所示 。
DAG组成和阶段划分
在上图中,从第3行开始,每一行代表一个RDD 。显然,第3行的ShuffledRDD是DAG的尾节点,而第7行的HadoopRDD是首节点 。我们来观察一下每一行串印的特点 。首先,最明显的是第4、5、6、7行前面有一个Tab,明显和第3行错位了,也就是说第3行的ShuffledRDD被划分为一个阶段(标记为stage0),而第4、5、6、7行的其他RDD被划分为另一个阶段(标记为stage0)假设第7行下面的RDD字符串打印了两个Tab,也就是和第7行错位了 , 那么第7行下面的RDD就被标记为新的阶段,以此类推 。
因此,通过RDD的toDebugString观察DAG的阶段划分时,tab是一个重要的指标 。此外,我们看到在第3行和第4行的开头有一个括号,括号中有一个数字,它标记了RDD的分区大小 。当然,还有更直观的方法来观察RDD、达格和舞台 。Spark的Web UI提供了更丰富的视觉信息 。但是Spark的Web UI面板众多,很容易让新生第一眼就无所适从 。也许后面时间允许的话我们会单独说一下Spark的web UI 。
附言本文是Spark分布式计算科普专栏第二篇文章 。作者的无知和粗心是必然的 。如果你有什么问题,或者觉得文章中的描述有遗漏或者不恰当,欢迎在评论区留言讨论 。要掌握一项技术,书本上的知识往往只占20%,30%靠讨论,50%靠实践 。更多的讨论可以激发更多的观点、视角和见解,只有这样,对一项技术的认知和理解才能更加深入和坚定 。
在这篇博文中,我们从DAG-Spark RDD算子的边缘开始,介绍连接RDD的两种算子:变换和动作,对懒惰计算有一个初步的了解 。然后以土豆工坊为例,介绍了DAGScheduler切割DAG和生成Stage的过程和步骤 。特别需要注意的是,DAGScheduler以Shuffle为边界划分Stage 。
最后,用上一篇文章的字数简单地演示了DAG和Stage之间的关系 。细心的读者可能已经发现,Spark是一个精致而复杂的分布式计算引擎,Spark中的很多概念在这篇博文中都有“预引”,在这篇文章中多次提到 。换句话说,这个博客引入了一些概念(如懒惰计算、Shuffle、TaskScheduler、TaskSet、Spark调度系统) 。这种叙述方式可能会给你带来困惑 。毕竟用一个不明确的概念去解释另一个新概念,总是不那么靠谱的 。
俗话说“杀人偿命,欠债还钱”,在后续的专栏中,我们将继续探讨Spark的核心概念和原理 , 慢慢偿还欠你的技术债,尽可能还原Spark分布式内存计算引擎的全貌 。毕竟Spark调度系统哪边神圣?DAGScheduler,连同TaskScheduler、SchedulerBackend、TaskSetManager等 。,玩权利游戏,且听下回分解 。
推荐阅读
- 上古卷轴5怎么安装mod
- car怎么读 可以怎么解释呢
- 春羽叶子发黄怎么办 春羽叶子发黄的解决方法
- 《文明6》卡顿问题解决心得分享
- 学富五车的近义词是什么 学富五车有哪些近义词
- 衣服爱起球怎么清洗比较好 衣服老爱起球该怎么处理
- 百分之90怀疑宫外孕 宫外孕有什么症状前期
- 魔兽怀旧服采矿1—300怎么冲
- 断夜奶的方法