sx是什么意思 shuffle什么意思( 二 )


掌握一个新概念最有效的方法之一就是找到相反的概念——相对于“懒惰计算”,大多数传统编程语言和编程框架的评估策略是“热切评估” 。比如我们熟悉的C,C,Java,每一条指令都会试图调度CPU , 占用时钟周期,触发计算的执行 。同时,CPU寄存器需要与内存通信,完成数据交换和数据缓存 。在传统的编程模式下,每一条指令都渴望被调度到“前线”,参与战斗 。
惯性计算模型不是这样的——具体来说,Spark,大部分RDD算子都是“稳”的,特别能屏住呼吸,他们会明确地告诉DAGScheduler:“哥们,你先走吧,别管我 , 我伸一会儿懒腰,抽根烟 。队伍的前排是我们的领导,没有他的命令 , 我们不会轻举妄动 。”有了对懒计算和早求值的基本了解,下面就来说说变换和动作的区别 。在Spark的RDD算子中,变换算子都是懒惰的求值运算,只参与DAG计算图的构建和表示计算逻辑,不会被立即调度和执行 。惰性求值的特点是只有在需要物化数据时才触发计算的执行 。RDD的Actions operator提供了各种数据物化操作 , 其主要职责是触发整个DAG计算链的执行 。并且只有当Actions操作符触发计算时,从DAG的开头到结尾的所有操作符(之前用于构建DAG的Transformations操作符)才会按照依赖的顺序依次被调度和执行 。
说到这里,读者不禁要问:Spark的惰性评价的计算模型有什么优点?或者反过来说,为什么Spark不采用传统的早期评测?不知道大家有没有听说过“延迟满足效应”(又称“糖果效应”),是指为了获得长远的、更大的利益,主动延迟甚至放弃现在的、更小的满足感 。俗话说“云要衣装花好看 , 猪要肥,人要红” 。Spark不仅是天才儿童,年纪轻轻也相当有天赋 。原来内功不是为了赢现在的一招半式 , 而是着眼于整个武林 。太过分了 。让我们把它拿回来 。总的来说,惰性计算为Spark执行引擎的整体优化提供了广泛的空 。关于惰性计算如何帮助Spark做全局优化——一个讲故事的人的嘴表达不了两件事 , 后面的文档我们慢慢开发吧 。
我们再来谈谈RDD算子 。除了常见的按转化和作用分类的方法外,作者还从适用范围和用途两个维度对老铁进行了分类 。毕竟人脑喜欢结构化的知识 , 官网的长蛇阵一词列表总是让人昏昏欲睡 。有了这个表,我们知道*ByKey的操作一定作用在配对的RDD上 。所谓成对RDD指的是通过模式明确区分的键、值对的RDD,而任意RDD指的是没有模式或具有任意模式的RDD 。从使用的角度可以分辨出RDD算子分类比较分散,篇幅比较小的原因,这里就不一一介绍了 。让我们得到我们需要的 。
值得一提的是 , 对于同一个计算场景,不同运营商带来的实现性能可能会有很大差异 。我们将在下面的性能调优章节中分析具体的问题 。好的,随着坑越挖越多,请稍等片刻 。先说一下刚才提到的根据FIFO原理的hot DAGScheduler 。
Dag调度程序-DAG的向导DAGScheduler是Spark分布式调度系统的重要组成部分之一 。其他组件包括TaskScheduler、MapOutputTracker、SchedulerBackend等 。DAGScheduler的主要职责是根据RDD依赖将DAG划分为阶段,以阶段粒度提交任务(TaskSet)并跟踪任务的进度 。如果把DAG看作是Spark job或者“战略地形”的执行路径,那么DAGScheduler就是这个地形的引导官,负责从头到尾摸清地形 , 根据地形特点安排兵力 。更形象的说,回到土豆车间的例子 , DAGScheduler要做的就是将抽象的土豆加工DAG转化为车间流水线上具体的薯片加工任务 。那么问题来了,DAGScheduler是如何探索“地形”的呢?如何划分阶段?划分阶段的依据是什么?再者,把DAG分成阶段有什么好处?Spark为什么要这么做?
DAGScheduler的核心职责
要回答这些问题 , 我们首先需要将DAG的“头”和“尾”定义如下:在DAG中 , 没有父RDD的节点称为头节点,而没有子RDD的节点称为尾节点 。以土豆工坊为例,其中有两个首节点 , 分别是potatosRDD和flavoursRDD,尾节点是flavouredBakedChipsRDD 。
DAG中开始和结束的定义
当DAGScheduler试图探索DAG的“地形”时,它以一种颠倒的方式从后往前走 。具体来说 , 对于土豆工场的DAG,DAGScheduler将从尾节点flavouredBakedChipsRDD开始,按照RDD依赖关系依次向前遍历所有父RDD节点,遍历过程中以Shuffle为边界划分阶段 。Shuffle字面意思是“洗牌”,没错,扑克游戏中的洗牌 。Shuffle在大数据领域扩展为“跨节点的数据分布”,指的是为了实现某种计算逻辑,数据需要在集群内的不同计算节点间定向分布 。在大多数场景下,Shuffle是当之无愧的“性能瓶颈” 。不客气的说,哪里有洗牌,哪里就有性能优化的空室 。我们后面会分别讨论Spark Shuffle的原理和性能优化技巧 。在土豆工坊的DAG中,有两个地方发生了Shuffle,一个是从bakedChipsRDD到flavouredbekedchipsrdd的计算,另一个是从flavoursRDD到flavouredbekedchipsrdd的计算,如下图所示 。

推荐阅读