您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
shuffle什么意思(sx是什么意思)
算子,节点,数据shuffle什么意思(sx是什么意思)
发布时间:2019-02-08加入收藏来源:互联网点击:
很多朋友想了解关于shuffle的一些资料信息,下面是小编整理的与shuffle相关的内容分享给大家,一起来看看吧。很多朋友想了解关于spark的一些资料信息,下面是小编整理的与spark相关的内容分享给大家,一起来看看吧。
专题介绍
2009年,Spark诞生于加州大学伯克利分校的AMP实验室(算法、机器与人实验室),2010年开源。2013年,Spark向Apache Software Foundation捐款,成为2014年Apache顶级项目。
如今,十年过去了,Spark已经成为大大小小的企业和研究机构常用的工具之一,仍然受到很多开发者的喜爱。如果你是初入江湖的“小虾米”,想了解和学习Spark,那么InfoQ和飞轮技术专家Leo的专题系列文章—— 《深入浅出 Spark:原理详解与开发实践》一定适合你!
本文是专题系列的第二篇。
继上一本书之后,在上一本书《内存计算的由来 —— RDD》中,我们从虚和实两个方面介绍了RDD的基本构成。d是由端到端的依赖关系和计算属性组成的计算路径。专业术语是Lineage —— lineage,也称为DAG(有向无环图)。为什么一个概念有两个名字?这两个不同的名字有什么区别和联系?简单来说,lineage和DAG从两个不同的角度描述了同一个东西。谱系,侧重于从数据的角度描述不同rdd之间的依赖关系;DAG从计算的角度描述了不同rdd之间的转换逻辑。如果说RDD是Spark对分布式数据模型的抽象,那么相应的,DAG就是Spark对分布式计算模型的抽象。
顾名思义,DAG是一种图。图计算模型的使用由来已久,早在上个世纪就被应用于图数据库的实现。任何图都包含两个基本元素:顶点和边。节点通常用于表示实体,而边表示实体之间的关系。比如《倚天屠龙记》社交网络的好友关系中,每个节点代表一个特定的人,每条边意味着两端的实体之间已经建立了好友关系。
易途龙社交网络
在上述社交网络中,朋友是相互的。比如张无忌和周芷若是朋友,所以图中的边没有方向性;另外,细心的同学可能已经发现,上面的图结构中还有“环”,比如张无忌、谢逊与白眉鹰王形成的关系环,张无忌、谢逊、紫衫龙王与小昭的关系环,等等。像上面这样的图结构叫做“无向循环图”。没有比较,就没有歧视。有向无环图(DAG)自然是一种具有方向性,没有“环”结构的图模型。读者们,你们还记得土豆工坊的例子吗?
马铃薯车间山
在上面的马铃薯加工DAG中,每个节点是一个RDD,每个边代表不同rdd之间的父子关系。——亲子关系天然是单向的,所以整个画面是有方向性的。此外,我们注意到在整个图中没有环结构。这样的土豆加工线可以说是最简单的有向无环图。每个节点的入度和出度都是1,整个图只有一个分支。
但工业应用中的Spark DAG要比这复杂得多,往往是由不同rdd的关联和拆分生成的具有多个分支的有向无环图。为了说明这一点,我们以土豆工坊为例。“原味”薯片推向市场一段时间后,作坊老板发现季度销量骤降,老板着急又无奈。这时有人向他建议:“为什么不多推出一些不同口味的薯片来迎合大众多样化的选择呢?”于是老板下了一道命令,工人们对装配线做了如下改动。
马铃薯车间先进生产线
与以前相比,新工艺增加了三条调味线,用于分配不同的调味粉。来自新装配线的辣椒粉被分配到收集小薯片的装配线,孜然粉被分配到中型薯片装配线,番茄粉被分配到大型薯片装配线。改造后的土豆工坊现在可以生产三种口味不同大小的薯片,分别是香辣小薯片、孜然中薯片、番茄大薯片。如果我们用flavoursRDD抽象调味品,那么新车间流程对应的DAG就会演化成有向无环图,有两个分支,如下图所示。
具有多个分支的Dag
在上一篇文章中,我们讨论了星火核心内功心法的第一个要领,3354RDD。在本文中,我们来谈谈内功。
功心法的第二个秘诀 —— DAG。RDD 算子 —— DAG 的边
在上一篇《内存计算的由来 —— RDD》最后,我们以 WordCount 为例展示不同 RDD 之间转换而形成的 DAG 计算图。通读代码,从开发的角度来看,我们发现 DAG 构成的关键在于 RDD 算子调用。不同于 Hadoop MapReduce,Spark 以数据为导向提供了丰富的 RDD 算子,供开发者灵活地排列组合,从而实现多样化的数据处理逻辑。那么问题来了,Spark 都提供哪些算子呢?
从表格中我们看到,Spark 的 RDD 算子丰富到让人眼花缭乱的程度,对于初次接触 Spark 的同学来说,如果不稍加归类,面对多如繁星的算子还真是无从下手。Apache Spark 官网将 RDD 算子归为 Transformations 和 Actions 两种类型,这也是大家在各类 Spark 技术博客中常见的分类方法。为了说明 Transformations 和 Actions 算子的本质区别,我们必须得提一提 Spark 计算模型的“惰性计算”(Lazy evaluation,又名延迟计算)特性。
掌握一个新概念最有效的方法之一就是找到与之相对的概念 —— 与“惰性计算”相对,大多数传统编程语言、编程框架的求值策略是“及早求值”(Eager evaluation)。例如,对于我们熟悉的 C、C 、Java 来说,每一条指令都会尝试调度 CPU、占用时钟周期、触发计算的执行,同时,CPU 寄存器需要与内存通信从而完成数据交换、数据缓存。在传统编程模式中,每一条指令都很“急”(Eager),都恨不得自己马上被调度到“前线”、参与战斗。
惰性计算模型则不然 —— 具体到 Spark,绝大多数 RDD 算子都很“稳”、特别能沉得住气,他们会明确告诉 DAGScheduler:“老兄,你先往前走着,不用理我,我先绷会儿、抽袋烟。队伍的前排是我们带头大哥,没有他的命令,我们不会贸然行动。”有了惰性计算和及早求值的基本了解,我们再说回 Transformations 和 Actions 的区别。在 Spark 的 RDD 算子中,Transformations 算子都属于惰性求值操作,仅参与 DAG 计算图的构建、指明计算逻辑,并不会被立即调度、执行。惰性求值的特点是当且仅当数据需要被物化(Materialized)时才会触发计算的执行,RDD 的 Actions 算子提供各种数据物化操作,其主要职责在于触发整个 DAG 计算链条的执行。当且仅当 Actions 算子触发计算时, DAG 从头至尾的所有算子(前面用于构建 DAG 的 Transformations 算子)才会按照依赖关系的先后顺序依次被调度、执行。
说到这里,各位看官不禁要问:Spark 采用惰性求值的计算模型,有什么优势吗?或者反过来问:Spark 为什么没有采用传统的及早求值?不知道各位看官有没有听说过“延迟满足效应”(又名“糖果效应”),它指的是为了获取长远的、更大的利益而自愿延缓甚至放弃目前的、较小的满足。正所谓:“云想衣裳花想容,猪想发福人想红”。Spark 这孩子不仅天资过人,小小年纪竟颇具城府,独创的内功心法意不在赢得眼下的一招半式,而是着眼于整个武林。扯远了,我们收回来。笼统地说,
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |