目录:
- 一、What is RDD?
- 1、RDD是一个弹性分布式数据集
- 2、RDD是一个弹性的分布式的数据集,是spark的基本抽象,RDD是不可变的,并且它由多个partition构成(可能分布在多台机器上,可以存memory上,也可以存disk里等等),可以进行并行操作
- 3、弹性:分布式计算时可容错
- 4、不可变:一旦产生就不能被改变
- 5、RDD中的数据是不可变的,分区存在的,也就是每次调用RDD就会形成新的RDD,旧的RDD中的数据是不会发生改变的
- 6、RDD 的基本概念:
- 7、RDD的全称:
- 8、RDD的五大特征:
- 二、Spark RDD分为两大类:
- 基于官网分为两类:transfotmation、Action
- 基于个人讲为四类:transfotmation、Action、create、presist
- 概念篇整理
- 缓冲效果:
- 三、RDD的依赖:
- RDD 分为宽依赖和窄依赖区分。
- 以下链接是常用算子整理:
- 转载著名出处,尊重原创。
- 如有错误,欢迎指正。
一、What is RDD?
1、RDD是一个弹性分布式数据集
2、RDD是一个弹性的分布式的数据集,是spark的基本抽象,RDD是不可变的,并且它由多个partition构成(可能分布在多台机器上,可以存memory上,也可以存disk里等等),可以进行并行操作
3、弹性:分布式计算时可容错
4、不可变:一旦产生就不能被改变
5、RDD中的数据是不可变的,分区存在的,也就是每次调用RDD就会形成新的RDD,旧的RDD中的数据是不会发生改变的
6、RDD 的基本概念:
RDD 是 Spark 提供的最重要的抽象概念,它是一种有容错机制的特殊数据集合,可以分布在集群的结点上,以函数式操作集合的方式进行各种并行操作。
使用textFile API构建的RDD,默认情况下RDD的分区数量和HDFS文件的block块数量一致;如果一个文件的大小小于一个block块,那么RDD的分区数量默认为2.
7、RDD的全称:
Resilient Distributed Dataset = > 弹性分布式数据集
Resilient ==> 指的是RDD的分区数量是可以进行控制的
Resilient ==>Distributed ==> 指的是RDD的分区分布式的存在于各个执行(Executor)节点上/task运行是分布式的
Dataframe ==>更像是关系型数据库中的表,有schema信息
Dataset ==> RDD中描述的是一个数据集,类似集合Array大的数据集合.
8、RDD的五大特征:
- RDD由一系列的分区组成
- 每个分区中的数据都会有一个计算函数(computing)
- RDD之间是相互依赖的
- 对于键值对RDD都会有一个分区器。(hash-partitioned)
- 数据本地化 (首先会处理自己本地的数据)
二、Spark RDD分为两大类:
基于官网分为两类:transfotmation、Action
基于个人讲为四类:transfotmation、Action、create、presist
概念篇整理
1.transfotmation(转换算子)
功能:是将一个RDD转换成另外一个RDD,也就是RDD的构建,这类操作中给定的的函数不会立即执行,并且调用这类API不会触发RDD的Job的执行。
如果函数的参数列表是这样子的话f: T => U,该函数就是transformation APi在这类api调用过程中,实质是基于RDD的DAG依赖图的也就是调用这类api的时候构建一张逻辑执行图,算子中的具体的代码是一个懒加载(lazy),只有当job运行的时候(也就是执行了action的算子的时候),才会把代码提交给executor去执行task任务
2.Action(活动算子)
功能:触发RDD的Job,将RDD的DAG图分为stage,进行提交给executor去执行。最终executor执行完成之后,返回结果给driver,这类操作就会触发Job的产生。
3.presist (RDD的缓存或者RDD的持久化)
功能:将RDD的数据缓存到磁盘或者内存,或者是缓存数据的清除。
缓冲效果:
1、将缓存数据保存到内存,或者磁盘,可以减少代码的编写和执行,加快代码的执行速度,前提是RDD的重用。
2、如果task任务执行失败,在恢复的过程中,task直接从缓冲中获取数据,task的运行减少代码的处理流程,不需要在执行缓存之前的代码。
3、RDD的缓冲基于RDD的分区的,也就是说要么缓冲整个分区的数据,要么不缓冲。
presist -->API:
rdd.cache //将RDD的数据保存在内存中
rdd.persist //将rdd的缓存数据使用不同的缓存级别
rdd.unpersist //将rdd的缓存清除
备注:缓存是一个lazy操作,但是清除缓存是一个action的操作
缓存等级的使用
rdd.cache() 默认就是memory_noly (面试题)
如下是使用最多,可以防止内存溢出。
rdd.persist(StorageLevel.Memory_AND_DISK) 先放内存在放到磁盘。
4、Create创建:读取外部数据源或者并行化已有数据集sc.textFile sc.parallize()
三、RDD的依赖:
RDD的依赖叫做lineage(血统) AS 生命线,当task执行失败的时候,就是基于生命线来恢复的
RDD 分为宽依赖和窄依赖区分。
宽依赖:父RDD的每个分区的数据到子RDD的时候可能在多个分区里面。
窄依赖: 父RDD的每个分区的数据到子RDD的时候,一定在同一个分区
常见:map、filter、flatMap。。。
注意:窄依赖的计算是一个流式计算,基于内存,每个API的执行的结果在窄依赖的执行过程中是不会输出到磁盘的,只有当窄依赖的执行阶段完成,数据才会被写到磁盘或者其他的外部储存系统
以下链接是常用算子整理:
算子链接:https://blog.csdn.net/weixin_46163590/article/details/105871215