RDD定义
??RDD(Resilient Distributed Dataset)是弹性分布式数据集,是spark中最基本的数据抽象,代表一个不可变、可分区、可并行计算的数据集合。 ??不可变:可认为RDD是分布式的列表(list)或数组(Array),它里面的值可增可减但是不可改变原有数据的值,这就是不可变,变量的声明使用 val; ??可分区:集合的数据被划分为很多部分,每部分称为分区(Partition); ??可并行计算:每个分区数据被一个任务(task)处理。 ??RDD将spark的底层细节隐藏起来,让开发者可以像操作本地集合一样以函数式编程的方式操作RDD,RDD中很多处理数据函数与列表相同或相似。
RDD特性
??RDD有五大特性:
- A list of partitions
RDD可看做是一个分区列表。首先它是一个列表,由于RDD是可分区的,所以这个列表是一个分区了的列表,也就是被划分成多个分片。划分的好处是可以并行计算,因为每个分片都会被一个 task 计算,分片数决定计算的并行度。在创建RDD时可以指定分片个数。 - A function for computing each split
RDD的计算是通过函数进行的,由于RDD是分区的,所以函数必须分配到每个分区上。 - A list of dependencies on other RDDs
一个RDD会依赖于其他多个RDD。RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算(spark 的容错机制)。 - Optionally, a partitioner for key-val RDDs
可选项,对于 key-value 类型的RDD会有一个 partitioner,即RDD的分区函数。当前spark实现了两种类型的分区函数,一个是基于哈希的 HashPartitioner,另一个是基于范围的 RangePartitioner。 - Optionally, a list of preferred locations to compute each split on
可选项,一个列表,存储每个 Partition 的优先位置。按照”移动数据不如移动计算“的理念,spark在进行任务调度的时候,会尽可能选择那些存有数据的 worker 节点来进行任务计算。
|