RDD(ResilientDistributed DataSet,弹性分布式数据集),一种特殊集合,支持多种来源,有容错机制,可以被缓存,支持并行操作;Spark的第二个抽象是两种共享变量,即支持并行计算的广播变量和累加器。RDD 是spark围绕的核心概念,也是最主要的抽象之一。对于RDD和spark,RDD是一种具有容错性基于内存的集群计算抽象方法,Spark则是这个抽象方法的实现。
spark一切都是基于RDD的,RDD就是spark输入的数据,作为输入数据的每个RDD有五个特征,其中分区、一系列的依赖关系和函数是三个基本特征,优先位置和分区策略是可选特征。
1)分区(partition):有一个数据分片列表,能够将数据进行切分,切分后的数据能够进行并行计算,是数据集的原子组成部分。
2)函数(compute):计算每个分片,得出一个可遍历的结果,用于说明在父RDD上执行何种计算。
3)依赖(dependency):计算每个RDD对父RDD的依赖列表,源RDD没有依赖,通过依赖关系描述血统。
4)优先位置(可选):每一个分片的优先计算位置(preferred locations),比如HDFS的BLOCK的所在位置应该是优先计算的位置。
5)分区策略(可选):描述分区模式和数据存放的位置,键-值对的RDD根据哈希值进行分区,类似于MapReduce中的Paritioner接口,根据key来决定分配位置 。
每个Transformation操作都会产生一种RDD,这里我们以HadoopRDD,MappedRDD,FilteredRDD,JoinedRDD为例对特征进行说明 。
RDD 一个很重要的属性是对父 RDD 的依赖,主要分为两种:窄依赖(narrow denependcy)和宽依赖(wide dependency)。
RDD Dependency
窄依赖
窄依赖指父 RDD 的每个分区最多被一个子 RDD 分区使用(一个子 RDD 可以使用多个父 RDD 的分区),如:map、filter、union 等算子。
如上图,对数据进行协同划分(co-partitioned)的 Join 也属于窄依赖,多个父 RDD 分区的所有 key 落入子 RDD 的同一个分区。
宽依赖
宽依赖指子 RDD 的每个分区依赖于父 RDD 的所有或多个分区,如:groupby、partition 等算子。
如上图,未对数据进行协同划分(co-partitioned)的 Join 属于宽依赖,一个父 RDD 分区的 key 落入子 RDD 的多个分区。
区分依赖关系
对于数据的计算,窄依赖的 RDD 可以在集群上的一个节点以 pipeline 的方式计算,不要在多个节点间交换数据;宽依赖的 RDD 会涉及数据的混合,需要计算好父分区的数据,然后在节点之间进行 Shuffle。
对于数据的恢复,窄依赖能够有效的进行节点恢复,只需要重新计算丢失 RDD 分区的所有父分区,不同节点之间可以并行计算;宽依赖单个节点的丢失可能导致 RDD 的所有祖先重新计算。
SparkContext对象代表到Spark集群的连接,可以用来创建RDD,广播变量和累加器。可以复制集合的对象创建一个支持并行操作的分布式数据集。
https://www.jianshu.com/p/ae6f8446534e