Spark 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

 
 

转载著名出处,尊重原创。

如有错误,欢迎指正。

原创文章 45 获赞 29 访问量 8691

猜你喜欢

转载自blog.csdn.net/weixin_46163590/article/details/105870658
今日推荐