1、什么是RDD
- RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合.
- Dataset:一个数据集,简单的理解为集合,用于存放数据的
- Distributed:它的数据分布式存储,并且可以做分布式的计算
- Resilient:弹性的
- 它表示的是数据可以保存在磁盘,也可以保存在内存中
2、RDD的五大特性
- A list of partitions
- 每个RDD都有一个分区列表
- A function for computing each split
- 作用在每个分区上面的函数
- A list of dependencies on other RDDs
- 一个RDD依赖其他多个RDD,这个特性很重要,rdd的容错机制就是根据这个特性而来的
- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
- 可选项:针对于 kv 键值对的RDD才具有该分区特性
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for
an HDFS file)
- 可选项 : 数据本地性,数据最优,选择尽量存储在worker节点上的数据节点。
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for
3、创建rdd方式
1、通过已经存在的集合
- val rdd1=sc.parallelize(Array(1,2,3,4))
2、读取外部数据源
- val rdd2=sc.textFile("文件")
-
3、由一个rdd转化成一个新的RDD
- val rdd3=rdd2.flatMap
4、RDD的算子分类
- transformation:转换操作,将一个rdd转换生成一个新的rdd(flatMap/map/reduceByKey),它属于懒加载,延迟执行,并不会立即触发任务的执行。
- action :此时才会真正的触发任务的计算。
5、rdd中的2种依赖关系
- 窄依赖:每个父RDD的partition最多只被子的rdd的一个partition
- 宽依赖:子rdd的partition会依赖于父rdd的多个partiiton
6、lineage(血统)
- 它会记录下当前作用在rdd上的分区数据(元数据)和一系列的转换行为,当子rdd中某个分区数据丢失之后,只需要通过血统来重新计算恢复当前丢失数据的分区(spark 具备容错机制)
7、RDD的缓存方式
- cache:直接将rdd中的数据,保存在内存中,其本质是persist(StorageLevel.MEMOEY_ONLY)
- persist:可以有丰富的缓存级别
- 当rdd设置了缓存之后,如果下面有需要用到该RDD的数据的时候,就不要重复计算,可以直接从缓存中获取得到。
8、checkpoint
会对数据进行一个持久化操作,保存在hdfs
使用的时候:
- 需要sc.setCheckpointdir 来设置一个检查点目录
- 对需要缓存的rdd调用checkpoint
- 注意:同样在执行数据缓存的时候,需要有对应的action算子操作,才会真正触发持久化操作。
在做checkpoint操作的时候,此时会先执行对应触发action算子的rdd结果,计算完成之后又会开辟一个新的job来计算你设置了checkpoint的rdd的结果。
在设置了checkpoint之后,对应这个rdd会改变之前的依赖关系,如果当前数据丢失了,只有重头计算得到。
如何使用checkpoint
- 可以对要做checkPoint的rdd,先进行一个cache
- 在做一个checkpint操作
数据恢复的一般顺序
- 内存---------->checkpoint------------>重新计算得到
评论已关闭
暂无评论