Spark RDD
1、课程目标
-
1、掌握RDD的原理
-
2、熟练使用RDD的算子来完成计算任务
-
3、掌握RDD的宽窄依赖
-
4、掌握RDD的缓存机制
-
5、掌握划分stage
2、RDD的概述
-
1、什么是RDD
-
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。
-
Dataset
-
它表示RDD就是一个数据集合,里面存放着很多的数据
-
-
Distributed
-
RDD的数据是分布式存储的,有助于分布式计算
-
-
Resilient
-
弹性的 —-> 它表示RDD中的数据是可以保存在内存中或者是磁盘里
-
-
-
3、RDD的五大属性
- A list of partitions
一组分区列表
- A function for computing each split
作用在每一个分区中函数
- A list of dependencies on other RDDs
一个rdd会依赖于其他多个rdd, spark的容错机制就是根据这个特性而来的
- Optionally, a list of preferred locations to compute each split on (e.g. block locations foran HDFS file)
(可选项)一组最优的数据块位置 数据本地性和数据最优。
4、创建RDD
* 1、由一个已经存在的scala集合
* val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))
* 2、通过sparkContext调用textFile读取外部数据源
* val rdd2=sc.textFile(“/words.txt”)
* 3、通过已经存在RDD经过算子操作之后生成新的RDD
* val rdd3=rdd2.flatMap(_.split(” “))
5、RDD的算子分类
* Transformation(转换)
* 一个RDD进行操作之后生成一个新RDD;它是延迟加载,并不会立即执行,它只是记录下了作用在RDD上的一系列操作。
* Action(动作)
* 它是一个动作,会触发整个任务真正的运行。
6、RDD的依赖关系
* 窄依赖
* 父RDD的每一个partition最多只被子RDD的一个partition所使用
* 比喻为:独生子女
* 宽依赖
* 子RDD多个partition会依赖父RDD同一个partition
* 比喻为:超生
7、lineage(血统)
* 会记录下当前RDD上元数据信息,以及对应作用在rdd上的转换行为。如果当前某一个RDD某个分区数据丢失之后,它是可以通过血统进行恢复。
8、RDD的缓存机制
* cache
* 针对于需要缓存的RDD调用cache方法,默认将数据缓存在内存中,但并不是执行cache操作之后就进行缓存,而是需要后面有action操作。其本质是调用了persist方法。
* persist
* 有丰富的缓存级别。可以通过调用RDD.persist(StorageLevel.缓存级别)
* 删除缓存数据
* rdd.unpersist(boolean)
* ture 表示阻塞一直等待缓存数据被删除
* false 表示不阻塞,边删除边进行下面的相关操作
9、checkpoint机制
* Checkpoint是为了相对而言更加可靠的持久化数据.可以将需要持久化的数据保存在HDFS上
* 如何设置checkpoint
* 利用sc.setCheckpointDir(HDFS目录)
* 针对于需要持久的RDD调用checkpoint方法
* rdd.checkpoint
* 后面也需要触发action的算子操作
* cache、persist、checkpoint区别
* 1、都可以缓存数据
* 2、cache其本质是调用了persist方法,默认是将数据缓存在内存中
* 3、persist有着丰富的缓存级别,这些缓存级别都在 Storagelevel这个object中
* 4、checkpoint执行后,生成了一个新的RDD为checkpointRDD,此时RDD的依赖关系已经发生改变,如果数据丢失了,是不可以通过重新计算恢复得到。而cache和persist它们的lineage血统是没有发生改变,数据丢失后还是可以重新计算得到。
* 5、数据丢失后,恢复的顺序
* 先在cache里查找,有就直接获取得到,如果没有设置cache,去checkpoint中查找,如果也没有设置checkpoint,这个时候只能否重新计算得到。