Spark计算模型RDD
RDD概念及特征: RDD(Resilient Distributed Daraset)叫做弹性分布式数据集,是spark中最基本的数据抽象,它代表一个不可变、可分区,里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错,位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显示地将数据还存在内存中,后续的查询能够重用这些数据,这极大的提升了查询速度。
弹性分布式数据集合,并且是spark最基本的编程抽象,而且是只读,可分区的,可以进行并行计算的一个对象
· 数据集:一个数据集合,用于存放数据的。RDD是一个数据容器,用来组织管理数据的。跟Array和List类似,并且都能够进行map、flatMap、filter等等
· 分布式:RDD中的数据是分布式存储的,可用于分布式计算,RDD的数据是分布存储的,也就是spark集群中每个节点上只存储了RDD的部分数据,计算同样也是分布式并行计算的
· 弹性:
1.存储的弹性:RDD的数据可以在内存和磁盘之间进行自由切换
2.可靠性的弹性:RDD的在丢失数据的时候能够给自动回复,RDD在计算过程中会出现失败的情况,失败以后会进行一定次数的重试(4次)
3.并行度的弹性:RDD的数据分区可以改变,进而增加并行计算的粒度
· RDD其他特点:
1.RDD的数据是只读的,每次操作都会产生新的RDD
2.RDD中数据可以缓存在内存,磁盘,HDFS上
RDD弹性:
1.自动进行内存和磁盘数据存储的切换;
spark优先把数据存放在内存中,如果内存放不下,就会放在磁盘里面,程序进行自动的存储切换
2.基于血统的高效容错机制;
在RDD进行转换和动作的时候,会形成RDD的Lineage依赖链,当某一个RDD失效的时候,可以通过重新计算上游的RDD来重新生成丢失的RDD数据
3.Task如果失败会自动进行特定次数的重试;
RDD的计算任务如果运行失败,会自动进行任务的重新计算,默认次数是4次
4.stage如果失败会自动进行特定次数的重试;
如果job的某个stage阶段计算失败,框架也会自动进行任务的重试,默认次数也是4次
5.checkpoint和persist可主动或被动触发;
RDD可以通过persist持久化将RDD缓存到内存或者磁盘,当再次用到该RDD时直接读取就行,也可以将RDD进行检查点,家差点会将数据存储在hdfs中,该RDD的所有父RDD依赖都会被移除
6.数据调度弹性;
spark吧这个job执行模型抽象为通用的有向无环图DAG,可以将多stage的任务串联或并行执行,调度引擎自动处理stage的而失败以及task的失败。
7.数据分片的高度弹性;
可以根据业务的特性,动态调整数据分片的个数,提升整体的应用执行效率。
RDD的依赖关系:
RDD个它依赖的父RDD的关系有两种不同的类型,窄依赖和宽依赖。
RDD的依赖类型
·窄依赖:父RDD中一个partition最多被子RDD中的一个partition所依赖,这种依赖关系就是窄依赖
·宽依赖:父RDD中的一个partition被子RDD中的多个partition所依赖,这种依赖关系就是宽依赖
一对一或者多对一:窄依赖
一对多或者多对多:宽依赖
宽窄依赖算子的判断依据是转换算子是否会产生shuffle操作,如果有shuffle操作则是宽依赖,否则是窄依赖
join即是宽依赖算子也是窄依赖算子(在一个shuffle操作之后,在使用join的时候,此时join就是窄依赖)
RDD的算子操作:
RDD的算子分为两类:
-
转换算子(transform算子):
将一个RDD通过转换算子操作以后会构建新的RDD,转换算子操作都是直接new新的RDD,此时RDD并没有进行真正的计算。转换算子只是对数据如何计算做了标记,转换算子都是赖加载
·重要算子操作:- mappartition:作用于每个分区之上的:
- mappartition和map的区别:
- mappartition相当于partition批量操作
·map作用于每一条数据
·重要区别:mappartition这个在大量task运动的时候可能会出现内存溢出的情况,小数据量的操作mappartition要优于map操作 - groupByKey算子和ReduceByKey算子的区别
- 1.groupByKey 返回值:key->集合 ReduceByKey返回值: key-》值
- 2.ReduceByKey操作会在本地进行初步merge操作,能够减少网络数据的传输
- coalesce 减少分区数据的算子
- 该算子可以进行shuffle也可以不进shuffle操作, coalesce(numPartitions: Int, shuffle: Boolean = false)
- repartition 实际上是调用了 coalesce 算子 ,而且 repartition一定会进行shuffle操作,既可以增加也可以减少分区
- mappartition相当于partition批量操作
-
Action算子
- action算子内部都会有一个runJob方法进行提交一个Job任务