SPARK-RDD 详解

RDD:
一、什么是RDD:分布式数据集,是spark中最基本的数据抽象,它代表一个不可变,可分区,里面的元素可并行计算的集合。RDD具有数据流模型特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存到内存,后续查询能够重用工作集,这极大的提升查询速度。

1.1.数据集:RDD是数据集合的抽象,是复杂物理介质上存在数据的一种逻辑视图。
1.2.分布式:RDD的数据可能在物理上存储在多个节点的磁盘或内存中。
1.3.弹性:虽然RDD内部存储的数据是只读的,但是,我们可以去修改(eg:通过repartition转换操作)并行计算单元的划分结构,也就是分区的数量。
综述:RDD是一个大的集合,将所有数据都加载到内存中,方便进行多次重用。1.它是分布式的,可以分布在多台机器上,2,它是弹性的,每个RDD都可以保存到内存,如果某个阶段RDD丢失,不需要从头计算,只需提取上一个RDD,再做相应的计算就可以。


二、RDD五大属性:
1.一组分片,数据集的基本组成
1.1每个分区通常与一个任务关联,分区的个数决定了并行的粒度;
1.2分区的个数可以在创建RDD的时候进行设置,默认情况下由节点的cores的个数决定;
1.3每个Partition最终会被逻辑映射为BlockManager中的一个block,而,这个Block会被下一个Task使用进行计算。
block与split区分:
默认情况下,是等同的,但是概念是不一样的。
只考虑存储的情况时,每个分区就是一个block;
在考虑计算时,每个分区、每个task要执行的数据整体,其实就是一个人split。

2.一个计算每个分区的函数即算子。
RDD由多个分区组成,每个分区不仅有数据还有计算分区数据的函数;
分批处理函数
2.1每个RDD都会实现计算,用于对分区进行计算
2.2函数会对迭代器进行复合,不需要保存每次计算结果;
2.3该方法负责接收父RDD流入法人records并行计算,然后输出加工后法人records。

3.RDD的依赖关系:宽依赖与窄依赖
RD的每次转换都会生产一个新的RDD,所以RDD之间会形成类似流水线一样的前后依赖关系。在部分RDD数据丢失时,spark可以通过这个依赖关系重写计算丢失的分区数据。
宽依赖:是否具有suffle操作,有则是;
窄依赖:一个父分区只有一个子分区。



讨论join的依赖关系:


4.一个Partioner:

对KVEDD,sortByKey, groupByKey,reduceByKey,combineByKe等操作都受partitioner的影响。
partitioner:制定了一个规则,作用在这个数据集之上,决定这个数据按照什么样的形式或者方法进行区分。
5.一个列表:存储存取每个Partion的优先位置。
5.1对于一个HDFS文件来说,这个列表保存的是每个partition所在块的位置。
5.2按照“移动数据不如移动计算的理念”,spark在进行任务调度时候,会尽可能将计算任务分配到其所要处理数据块存储位置。
5.3.每个RDDgetPreferredLocations的实现中,都会尽可能选择父RDD中对于的RDDgetPreferredLocations,其次选择自己设置的优先位置。
 

发布了20 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/heijunwei/article/details/89765612