Spark(六) -- Spark计算模型
整个Spark框架都是基于RDD算子来进行计算的。
What is RDD?
Resilient Distributed Dataset(RDD),分布式弹性数据集,是Spark上的一个核心抽象
表示用于并行计算的,不可修改的,对数据集合进行分片的数据结构
简单地,可以将RDD看成是Spark平台上的通用货币
在Spark上,针对各种各样的计算场景存在着各种各种的RDD,这些RDD拥有一些共同的操作,例如map,filter,persist等,就好像RDDs都是一个总RDD的子类一样,拥有所有RDD的共同特性
同时RDDs也拥有能表达自己特性的操作,例如PairRDDR有groupByKey,join等操作,而DoubleRDD有Doubles操作
所有的RDD都有以下特性:
可以表示数据分片的列表集合。将原始数据经过某些分片处理生成RDDs,这些RDD将用于并行计算
通用的算子来计算每个数据分片
包括transformation和action两大算子类别。
RDD之间拥有依赖关系
transformation只对数据进行处理而不计算,处理过程会被画成一个DAG有向无循环图,只有当action操作要获取结果时,才根据DAG图来进行并行计算。
DAG图会根据RDD之间的依赖关系被分解成一个个stage之后提交
形成DAG图的过程中也会根据RDD之间的依赖关系形成Lineage
这是Spark上一个重要的容错机制
当某个节点计算错误时,只需要根据Lineage重新计算相关的操作而不必回滚整个程序
以下两张图是来源自网络的
Spark中部分RDD类的截图
transformation和action操作的Function截图
除了transformation和action两大类算子之外,RDD还有一个比较特殊的算子
如persist和checkpoint,它们既不属于transformation也不属于action
但是都会触发Job的运行
persist将RDD结果持久化,修改了RDD中meta info的存储级别
checkpoint在持久化RDD的同时还切断了RDD之间的依赖血缘关系。除了修改了存储级别,还修改了meta info中RDD的lineage依赖关系
两者返回的均是修改后的RDD而不是产生的RDD(transformation是产生新的RDD,action是对RDD取结果)
RDD之间的依赖关系可以分为Narrow,Wide:窄依赖和宽依赖两种
窄依赖:子RDD中的每个数据块只依赖于父RDD中对应的有限个固定的数据块,可以理解成父子RDD是一对一或者多对一的关系,例如:map变换,前后的数据都是一行对一行的。一个子RDD可以根据其父RDD直接计算得出,因而子RDD出现计算错误的时候,只需要重新计算对应的父RDD即可
宽依赖:子RDD中的一个数据块可以依赖于父RDD中的所有数据块。即一对多的情况,例如:groupByKey变换,子RDD中的数据块会依赖于多个父RDD中的数据块,因为一个key可能存在于父RDD的任何一个数据块中 。宽依赖中的子RDD要等到所有的父RDD计算完成之后才能进行计算,当数据丢失时需要对所有祖先RDD进行重新计算
依赖关系图:
其中,宽依赖是会触发shuffle行为的
而shuffle操作可以减小集群之间网络传输的压力,对数据进行一定的提前处理工作,对于提高整个集群的处理性能是十分重要的
在Spark中shuffle操作会是将DAG图划分成一个个stage的起点
如图所示:
map和union是属于transformation操作的。这里会涉及到一个pipeline的概念,对数据切片之后并行协同计算,从图中我们可以看到,map和union的时候Task之间的处理是并行的,而协同体现在当某个Task计算缓慢的时候,集群会启动一个新的节点来计算该Task,哪个节点先处理完毕就采用哪个节点的结果
groupBy和join操作是产生RDD之间的宽依赖的,这是一个shuffle过程,也是触发划分stages的起点,如上图中的三个stage
从物理的角度看RDD其实是一个元数据结构,存储着Block和Node之间的映射关系
关于Spark的transformation,action和划分stage等过程都是怎么处理的,整个作业的处理流程是什么,请看:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spark(五) -- Spark Streaming介绍与基本执行过程
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/45770881 Spark Streaming作为Spark上的四大子框架之一,肩负着实时流计算的重大责任 而相对于另外一个当下十分流行的实时流计算处理框架Storm,Spark Streaming有何优点?又有何不足呢? 首先,对于Storm实时流处理惊人的低延迟性,Spark Streaming的不足很明显 Storm官方说的最低延迟可以使多少毫秒级别的 而Spark Streaming只能做到压秒,也就是零点几秒 相对于Storm的实时性来说,Spark Streaming甚至只能说是准实时的 But,Spark Streaming虽然在延迟性方面比不过Storm,但是Spark Streaming有太多太多的优点,以至于能够让人的注意力从Storm转移到Spark Streaming身上 第一,Spark Streaming是Spark的核心子框架之一。 说到Spark核心,那就不得不说RDD了。 Spark Stream...
- 下一篇
Spark(七) -- Scala快速入门
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/45830709 Scala作为Spark的开发语言,想要成为Spark高手,精通Scala是必须要走的一条路 然后一门语言并不是你想精通就能够精通的,更何况是Scala这种面向对象又面向函数的编程语言,个人觉得其学习的门槛会比C#,Java等面向对象语言要高 所以,这篇文章是建立在有一点编程语言知识的基础上的(如学过C#或者Java等),其实所有语言都是大同小异的,学会了一门语言在学其他的就不会像刚开始那么吃力了,因为它们很多概念都是相通的 本篇文章主要是介绍Scala本身的一些特性,以便以能够快速的上手开发,而对于真正要精通Scala,显然要付出的努力还要很多 安装Scala的开发环境就不具体介绍了,请自行百度之。IDE使用的是Eclipse For Scala,下载地址: Eclipse For Scala 本文大概从以下几个方面来介绍Scala: 声明变量的关键字 方法的定义格式 条件表达式 默认参数,带名参数和变长参数 l...
相关文章
文章评论
共有0条评论来说两句吧...