RDD:弹性分布式数据集(Resilient Distributed Dataset,简称 RDD)。RDD 其实就是分布式的元素集合。----Spark最根本的数据抽象。
在 Spark 中,对数据的所有操作不外乎创建 RDD、转化已有 RDD 以及调用 RDD 操作进行求值。而在这一切背后,Spark 会自动将RDD 中的数据分发到集群上,并将操作并行化执行。
RDD的五个属性:
(1)一组分片(Partition),即数据集的基本组成单位(RDD是由一系列的partition组成的)。对于RDD来说每个分区都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么会采用默认值。默认值就是程序所分配到CPU Core的数目。下图描述了分区存储的计算模型,每个分片的存储是由BlockManager实现的。每个分区都会被逻辑映射成BlockManager的一个Block,而这个Block会被一个Task负责计算。
(2)一个计算每个分区的函数。Spark中的RDD计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每一次计算的结果。
(3)RDD之间的依赖关系。RDD每次转换都会形成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失的时,Spark通过这种依赖关系重新计算丢失的分区数据,而不是对RDD所有分区进行重新计算。
(4)Partitioner(分区器)作用在K,V格式的RDD上。当前Spark实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner。只有对于key-value的RDD,才会有Partitioner,非key-value的RDD的Partitioner的值是None。Partitioner函数不但决定了RDD的分片数量,也决定了parentRDD Shuffle输出时的分片数量。
(5)RDD提供一系列最佳的计算位置(preferred location)。对于一个HDFS文件来说,这个列表保存的就是每个Partition所在块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,尽可能的把计算任务分配到其所要处理数据块的存储位置(数据本地化)。
问题一:什么是K,V格式的RDD?
如果RDD里面存储的数据都是二元组(Tuple2)对象,那么这个RDD我们就叫做K,V格式的RDD。
问题二:哪里体现RDD的弹性(容错)?
partition数量,大小没有限制,体现了RDD的弹性。
RDD之间依赖关系,可以基于上一个RDD重新计算出RDD。
问题三:哪里体现RDD的分布式?
RDD是由Partition组成,partition是分布在不同节点上的。