什么是RDD?RDD的主要属性?

2025年3月1日09:12:21什么是RDD?RDD的主要属性?已关闭评论

什么是RDD?

RDD是一个不可变的分布式对象集合,是Spark中最基本的数据抽象。在代码中,RDD是一个抽象类,代表一个弹性的、不可变的、可分区的、里面的元素可并行计算的集合。

每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上。RDD可以包含Python、Java、Scala中任意类型的对象,甚至可以包含用户自定义的对象。RDD的转换操作都是惰性求值的,所以不应该把RDD看作存放着特定数据的数据集,而最好把每个RDD当作我们通过转换操作构建出来的、记录如何计算数据的指令列表。

RDD表示只读的分区的数据集,对RDD进行改动时,只能通过RDD的转换操作由一个RDD得到一个新的RDD,新的RDD包含了从其他RDD衍生所必需的信息。RDD之间存在依赖,RDD的执行是按照依赖关系延时计算的。如果依赖关系较长,那么可以通过持久化RDD来切断依赖关系。RDD逻辑上是分区的,每个分区的数据抽象存在,计算的时候会通过一个compute函数得到每个分区的数据。如果RDD是通过已有的文件系统构建的,那么compute函数读取指定文件系统中的数据;如果RDD是通过其他RDD转换而来的,那么compute函数首先执行转换逻辑,也就是对其他RDD的数据进行转换。

RDD的主要属性?

RDD的主要属性如下:

(1)A list of partitions:多个分区。

分区可以看作数据集的基本组成单位。对于RDD来说,每个分区都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分区数,如果没有指定,就会采用默认值。默认值就是程序所分配到的CPU Core的数目。每个分配的存储是由BlockManager实现的。每个分区都会被逻辑映射成BlockManager的一个Block(块),而这个Block会被一个task计算。

(2)A function for computing each split:计算每个切片(分区)的函数。

在Spark中,RDD的计算是以分区为单位的,每个RDD都会实现compute函数以达到这个目的。

(3)A list of dependencies on other RDDs:与其他RDD之间的依赖关系。

RDD的每次转换都会生成一个新的RDD,所以RDD之间会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。

(4)Optionally,a partitioner for key-value RDDs(e.g. to say that the RDD is hash-partitioned):对存储键-值对(key-value pairs)的RDD来说,还有一个可选的分区器。

只有存储键-值对的RDD才会有分区器;没有存储键-值对的RDD,其分区器的值是None。分区器不但决定了RDD的本区数量,也决定了父RDD Shuffle输出时的分区数量。

(5)Optionally,a list of preferred locations to compute each split on (e.g. block locations for an HDFS file):存储每个切片优先位置的列表。

例如,对于一个HDFS文件来说,这个列表保存的就是每个分区所在文件块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到它所要处理的数据块的存储位置。

  • 版权声明:本篇文章(包括图片)来自网络,由程序自动采集,著作权(版权)归原作者所有,如有侵权联系我们删除,联系方式(QQ:452038415)。