1.RDD的作用
(1)让开发者大大降低开发分布式应用程序的门槛以及提高执行效率(特指和其他框架做对比)
例如:其他框架你要考虑数据的拆分、通信机制、作业挂了如何处理、作业调度、序列化等等。但是这些在RDD中直接通过map、reduce就可以完成了。
2.什么是RDD?
(1)RDD: Resilient Distributed dataset(弹性 分布式 数据集)
弹性:体现在计算层面,比图数据丢失的一些找回操作
(2)the basic abstraction in spark(他是spark最基础的一个抽象类)
(3)immutable、partitioned of collecttion of elements that can be operated on in parallel:不可变的、可拆分的、可以并行操作的元素的排序分区
(4)一个RDD有多个partition
(5)RDD是一个抽象类,所以它是不能直接使用的(new不出对象),因此我们使用的时候直接使用其子类即可。
(6)Serializable:序列化的目的改善网络的传输,所以它能直接影响整个框架的优劣
3.RDD的五大特性
(1)A list of partition:他是RDD的基本构成,就是一系列分区。
(2)A function for computing each split/partitio:一个计算方法是作用在每个分区上面的。
(3)A list of dependencies on other RDDs:RDD会记录它的依赖 ,为了容错(重算,cache,checkpoint),也就是说在内存中的RDD操作时出错或丢失会进行重算。比如RDD A =》RDD B ==》RDD C,那么C与A直接是有依赖关系的,当我们的某个分区挂掉的时候,spark可以通过我们的依赖关系来恢复这 一个分区。
(4) Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned):可选项,如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区,例如这里自定义的Partitioner是基于key进行分区,那则会将不同RDD里面的相同key的数据放到同一个partition里面。
(5)Optionally, a list of preferred locations to compute each split on:最优的位置去计算,也就是数据的本地性。
4.RDD五大特性在源码中的体现
(1) def compute(split: Partition, context: TaskContext): Iterator[T] :从这个计算方法中可以看到,传入的是partition和context这正好体现了RDD的第二大特性
(2)def getPartitions: Array[Partition] :这个方法返回的是一个Partition的数组,这体现了第一大特性。
(3)protected def getDependencies: Seq[Dependency[_]] = deps :这个方法由子类实现,以返回该RDD如何依赖于父RDDs,这体现了第三大特性。
(4)protected def getPreferredLocations(split: Partition): Seq[String] = Nil :这个方法传入的是分区,得到的是最佳计算位置,也就是首选位置。体现了第五大特性
(5)@transient val partitioner: Option[Partitioner] = None :这个方法,可选地覆盖子类来指定它们是如何分区,@transient表示不可序列化。
5.RDD的Partition解读
(1)partition是可以存储在多个地方的(比如DISK,mermory,副本)
(2)在Spark计算中有多少个partitions就有多少个task,一个worker——》多个excutors——》Partitioner