RDD是弹性分布式数据集;
Internally, each RDD is characterized by five main properties:
* - A list of partitions
* - A function for computing each split
* - A list of dependencies on other RDDs
* - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
* - Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
rdd具有5个特性:
1. 分区列表
rdd是被分区的,每个分区都会被一个task处理,分区数决定并行计算数量,rdd的并行度默认从父rdd传给子rdd; 默认情况下,hdfs上的块文件数就是spark处理时的分区数量,当然也可以在创建RDD时,人为指定RDD的分区数量,同时RDD的分区数最好设置为集群core数量的2-3倍;
2. 计算函数
spark的RDD的计算函数是以分片为基本单位的,每个RDD都会实现compute函数,对每个分区内的数据进行计算;其中,RDD的算子有宽窄依赖算子的分类,决定是否划分stage, 同时也有transformation和action算子的分类,决定是否触发job;
3. 血缘关系
由于RDD每次转换都会生成新的RDD,所以RDD会形成类似流水线的前后依赖关系;
4. 分区器
分区只发生在shuffle阶段, 分区器控制分区规则和下游的分区数;当前Spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner; 并且只有对于key-value的RDD,才会有Partitioner,非key-value的RDD的Parititioner的值是None;
5. 分区数据的位置列表
此列表存储了每个Partition的优先位置,对于HDFS文件来说,就是每个分区数据的位置; 有了数据位置信息后,就可以实现数据不动代码动的特点,使得计算发生在本地;