Spark2什么是RDD
1.RDD
1.1RDD定义
让开发者大大降低开发分布式应用程序的门槛以及提高执行效率
Resilient Distributed Dataset(RDD) 也就是弹性分布数据集
弹性体现在计算之上,代表的是spark可以做到在做分布式计算的时候可以容错,比如说某个节点挂了,或者是某个节点数据丢失了,可以用RDD的机制进行数据修复,这是计算层面得.
分布式也就是数据可以跨节点存储在不同的节点上,spark计算的时候也一样,代码可以运行在一个和多个节点之上,提升计算效率.
数据集在spark中可以通过读文件创建,或者通过编程的方式创建,或者通过一个数据集转换成另一个数据集,类似于hdfs的block.
1.RDD是不可变的,但是能通过RDDA转换为RDDB
2.RDD的元素可以被拆成分区,可以理解成hdfs的block或者是mapreduce的Inputsplit
3.并且RDD的分区可以被并行操作.
例如:RDDA:(1,2,3,4,5,6,7,8,9) operated +1
hadoop000:Partition1:(1,2,3) +1
hadoop000:Partition2:(4,5,6) +1
hadoop000:Partition3:(7,8,9) +1
RDDA执行了+1的操作,那么RDDA的3个partition分区都会执行+1操作,并且是并行的
1.2RDD源码定义
abstract class RDD[T: ClassTag](
@transient private var _sc: SparkContext,
@transient private var deps: Seq[Dependency[_]]
) extends Serializable with Logging
1.抽象类:RDD必然是有子类实现的,使用时直接使用其子类即可.
2.Serializable:网络传输需要序列化,序列化好坏直接影响框架的性能
3.Logging:日志
4.T:泛型,RDD支持各种数据类型
5.SparkContext:
6.@transient:
2.RDD的五大特性
Internally, each RDD is characterized by five main properties:
1.A list of partitions
2.A function for computing each split
3.A list of dependencies on other RDDs
4.Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
5.Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
1.RDD有很多分区partition.
2.函数对RDD的操作是作用于所有的分区partition,函数的应用实现了RDD之间partition的转换.
3.RDD跟RDD之间有依赖关系,当依赖关系为窄依赖时,RDD中某个分区数据丢失的时候,spark可以通过依赖关系重新计算分区里的数据,而不是对所有RDD进行重新计算.
RDDA => RDDB => RDDC => RDDD
4.(可选项)Partitioner 都是key-value形式的(默认使用hash).例如这里自定义的Partitioner是基于key进行分区,那则会将不同RDD里面的相同key的数据放到同一个partition里面
5.(可选项)对某个分区(分片)进行计算的时候,会在最优的位置去计算,也就是数据本地性。
3.RDD特性和源码的对应关系
def compute(split: Partition, context: TaskContext): Iterator[T]
可以看到这个compute计算方法传入参数包含了split: Partition,这就是RDD的第二特性
protected def getPartitions: Array[Partition]
getPartitions方法返回类型是一个Array[Partition]类型,得到的是partition的集合.对应了RDD的第一特性
protected def getDependencies: Seq[Dependency[_]] = deps
getDependencies方法返回类型是Seq[Dependency[_]],对应了RDD的第三特性
protected def getPreferredLocations(split: Partition): Seq[String] = Nil
进行计算的时候要获得最佳位置PreferredLocation,也就是getPreferredLocations方法,最后的返回结果是一个Seq[String],也就是路径的集合,对应了RDD的第五特性
@transient val partitioner: Option[Partitioner] = None
可以被子类覆盖,可以指定需要的partitioner,对应了RDD的第四特性