cindysz110 / blog

8 stars 1 forks source link

[Spark] RDD初识 #25

Open cindygl opened 6 years ago

cindygl commented 6 years ago

Spark Github:https://github.com/apache/spark RDD源码查看: image

1. 什么是RDD

RDD - Resilient Distributed Dataset, 弹性分布式数据集 Resilient - 弹性:代表spark在分布式计算时可以容错(比如某节点宕机、某一部分数据丢失、它可以通过RDD的一些机制来进行修复),准确地说弹性是体现在计算方面的; Distributed - 分布式:数据可能是跨节点、存储在不同的节点之上; Dataset - 数据集:spark中数据集可以以读一个文件的方式创建,也可以通过编程的方式创建,还可以通过数据集的转换来得到一个新的数据集。数据集可以被拆分成很多个分区来存储和计算(可以理解为HDFS中的block,或者mapreduce里面的InputSplit,一个文件就是一个dataset)。

RDD是spark中的基本抽象,它表示不可变的(val,意味着RDD一旦产生,就不可以被改变)、可以并行操作的分区元素集合。

RDDA:(1,2,3,4,5,6,7,8,9) opearted + 1 拆分成3个分区: hadoop000:Partition1:(1,2,3) +1 hadoop001:Partition2:(4,5,6) +1 hadoop003:Partition3:(7,8,9)+1 对RDDA做一个+1 的操作: operated + 1,即对所有的分区都做一个+1的操作。

2. RDD类定义(源码):

abstract class RDD[T: ClassTag](
    @transient private var _sc: SparkContext,
    @transient private var deps: Seq[Dependency[_]]
  ) extends Serializable with Logging {
}

2.1 源码解读:

1) 抽象类 - 意味着这个类是不能直接使用的(不能直接new一个抽象类),只能借助于子类。RDD必然是有子类实现的,我们使用时直接使用其子类即可; 2) Serializable - 序列化(分布式集群性能); 3) Logging - 在Spark1.6里面可以直接使用,在2.0版本里被移走了,不能直接使用(想用可以自己写); 4) T - 泛型,代表RDD可以支持多种数据类型,RDD里面存储的数据类型可以是多种的; 5) SparkContext; 6) @transient 修饰符。

2.2 RDD的五大特点:

1) A list of partitions (必选项)
RDD的基本构成是以partition构成的 2) A function for computing each split
split即partition(必选项)
3) A list of dependencies on other RDDs (必选项)
RDDA(加载来的)=>RDDB(B依赖于A)=>RDDC(C依赖于B)=>RDDD(D依赖于C) RDD和RDD之间有依赖关系 当RDDA的某一个partition挂掉了,把数据重新加载一下即可 当RDDC的某一个partition挂掉了,从RDDB里面的partition做一个转换就过来了 上面的过程体现了RDD的弹性 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)(可选项)

2.3 RDD的五大特点和源码的关系

def compute(split: Partition, context: TaskContext): Iterator[T] ==> 特点2 protected def getPartitions: Array[Partition] ==> 特点1 protected def getDependencies: Seq[Dependency[_]] = deps ==> 特点3 protected def getPreferredLocations(split: Partition): Seq[String] = Nil ==> 特点5 @transient val partitioner: Option[Partitioner] = None ==> 特点4

RDD的出现大大降低开发分布式应用程序的门槛,以及提高执行效率。