- 1) A list of partitions
一个分区列表,一个rdd有多个分区,后期spark任务计算是以分区为单位,一个分区就对应上一个task线程。 通过val rdd1=sc.textFile(文件) 如果这个文件大小的block个数小于等于2,它产生的rdd的分区数就是2 如果这个文件大小的block个数大于2,它产生的rdd的分区数跟文件的block相同
- 2)A function for computing each split
由一个函数计算每一个分片 比如: rdd2=rdd1.map(x=>(x,1)) ,这里指的就是每个单词计为1的函数
- 3)A list of dependencies on other RDDs
一个rdd会依赖于其他多个rdd,这里就涉及到rdd与rdd之间的依赖关系,后期spark任务的容错机制就是根据这个特性而来。比如: rdd2=rdd1.map(x=>(x,1))rdd2的结果是通过rdd1调用了map方法生成,那么rdd2就依赖于rdd1的结果对其他RDD的依赖列表,依赖还具体分为宽依赖和窄依赖,但并不是所有的RDD都有依赖。
- 4)Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
(可选项) 对于kv类型的rdd才会有分区函数(必须要产生shuffle),对于不是kv类型的rdd分区函数是None。 分区函数的作用:它是决定了原始rdd的数据会流入到下面rdd的哪些分区中。 spark的分区函数有2种:第一种hashPartitioner(默认值), 通过 key.hashcode % 分区数=分区号第二种RangePartitioner,是基于一定的范围进行分区。
- 5)Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
(可选项) 一组最优的数据块的位置,这里涉及到数据的本地性和数据位置最优 spark后期在进行任务调度的时候,会优先考虑存有数据的worker节点来进行任务的计算。大大减少数据的网络传输,提升性能。
移动数据不如移动计算理念
RDD主要有两大操作:转换(Transformations)和操作(Actions):