c语言sscanf函数的用法是什么
276
2022-12-02
浅谈Spark原理(二)RDD
RDD(Resilient Distributed Dataset,弹性分布式数据集)的概念与数据结构中抽象数据类型(Abstract Data Type)的概念类似,它也包含了数据模型以及定义在该模型上的操作,其中数据模型中增加了为支持分布式计算的一些属性。引用《Spark权威指南》中对RDD描述,“RDD是一个只读不可变的且已分块的记录集合,并可以被并行处理”。查看Spark源码,RDD这个抽象类的注释中,给出了RDD的五个主要内部属性:
1) 数据分片列表
这个属性是为了支持对数据进行分布式计算。Spark是以数据分片为单位进行分布式计算。例如,某个RDD包括5个分片,那么就会把这5个数据分片逐个分发到节点上进行计算,每次分发一个完整的数据分片。
2) 作用在每个数据分片的计算函数
这个属性定义了对数据分片的处理逻辑或者说处理算法。抽象RDD类中没有提供实现,由具体的子RDD自行定义。
3) 描述与其他RDD的依赖关系的列表
这个属性出于下面两个层面的考虑:
a) 实际业务中的数据处理往往包括多个处理步骤,Spark为简化编程,将RDD定义为不可变的数据集,同时为RDD提供了多种操作API,每个操作API都返回一个新的RDD,如下图所示,对RDD A进行groupby操作后得到一个新的RDD B,RDD B经过sum之后得到一个新的RDD C等等。为了表示这些RDD之间的依赖关系,设置了依赖关系的这个属性。
b) Spark为了实现同一个Stage之间的操作达到pipeline计算(后面的章节详细讨论Pipeline计算)的目的,Spark采用了lazy transformation的机制,只有对action的操作才会触发真正的计算,这样计算的触发顺序是从后往前推。例如上图中,只有对 RDD D进行的collect操作是action操作,才会触发真正的计算,前面的groupby、sum、sort都不会触发的真正计算。当对D进行collect操作时,RDD D并没有真正计算出来,需要通过D的依赖关系,找到D依赖于C,把C计算出来才能计算出D;同理C此时也并没有计算出来,需要通过C的依赖关系,找到C依赖于B,把B计算出来才能计算出C,依此类推。综上,RDD的属性中需要有依赖关系。
4)(可选)为key-value RDD配置的Partitioner(分片方法,如hash分片)
这个属性可以理解为“数据分片列表”的一个附加属性。具体子RDD类可以通过这个属性定制划分数据分片的方法。
5)(可选)优先位置列表,根据数据的本地特性,指定了每个Partition分片的处理位置偏好(例如,对于一个HDFS文件来说,这个列表就是每个文件块所在的节点)。
这个属性为指定对某个数据分片的处理在哪个节点上进行提供了途径。假设集群有四个节点Worker1,Worker2,Worker3,Worker4可对数据分片进行处理,如果数据分片split A的优先位置列表是Worker1、 Worker2,则Spark会对split A的处理优先分发到Worker1或Worker2上进行。
关于上述5个基本属性,Spark源码注释中的描述及相关代码如下:
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~