RDD原码:https://github.com/apache/spark/tree/master/core/src/main/scala/org/apache/spark/rdd
什么是RDD?
一个弹性可分布式的数据集。弹性主要体现在计算之上。他是spark里一个最基本的抽象单元。代表了一个immutable(不可变的),能够并行操作的可以被分区的数据集 partitioned collection of elements that can be operated on in parallel。
弹性体现在计算之上,比如某个节点挂了,可以通过RDD的一些机制恢复数据。
分布式意味着数据跨节点存储在不同的节点之上。
RDDA:(1,2,3,4,5,6,7,8,9)
hadoop000:Partition1:(1,2,3)
hadoop001:Partition2:(4,5,6)
hadoop002:Partition3:(7,8,9)
RDD的定义:
abstract class RDD[T: ClassTag](
@transient private var _sc: SparkContext,
@transient private var deps: Seq[Dependency[_]]
) extends Serializable with Logging {
可以看出这是一个抽象类,借助于子类实现,使用时直接使用子类即可。
可序列化。可存储各类数据。
为什么要序列化?因为不同的RDD之间需要进行转化(序列化:数据转化成二进制,二进制转化为数据)
RDD的五大特性:
- 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)
1)、 由分区构成
2)、对RDD操作就是对所有的split/partition做计算
3)、RDD之间有依赖关系
4)、可选:key-value型的RDD是根据哈希来分区的,类似于mapreduce当中的Paritioner接口,控制key分到哪个reduce。
5)、可选:每一个分片的优先计算位置(preferred locations),比如HDFS的block的所在位置应该是优先计算的位置。(存储的是一个表,可以将处理的分区“本地化”)
RDD5五大特点和RDD源码中的对应关系:
def compute(split: Partition, context: TaskContext): Iterator[T]
## 对RDD做计算就是对RDD里面的分区做计算
protected def getPartitions: Array[Partition]
## 由分区构成,由partition组成的数组。
protected def getDependencies: Seq[Dependency[_]] = deps
## RDD之间有对应关系
protected def getPreferredLocations(split: Partition): Seq[String] = Nil
## 返回最合适的路径
@transient val partitioner: Option[Partitioner] = None
## 对应KV
在Spark中,计算式有多少partition就对应有多少个task来执行
933

被折叠的 条评论
为什么被折叠?



