Spark编程模型

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容