RDD深入讲解

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来执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值