spark第二篇RDD
-
-
-
- RDD概述
- 创建RDD
- RDD的算子分类
- RDD的依赖关系
- 血统
- RDD的缓存
- DAG有向无环图
-
- [1 什么是DAG](#1 什么是DAG)
- [2 划分stage](#2 划分stage)
- [3 stage内部](#3 stage内部)
- checkpoint机制
- spark的运行架构
-
-
RDD概述
1、什么是RDD
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合.
Dataset:它就是一个集合,可以存储很多的元素。
Distributed:它的数据是分布式存储的,方便后期进行分布式计算。
Resilient:它表示弹性,它表示的含义:RDD中的数据可以保存在内存中或者磁盘中。
2、RDD的五大属性
* - A list of partitions
一个分区列表
* - A function for computing each split
作用在每一个分区中的函数
* - A list of dependencies on other RDDs
一个RDD会依赖于其他多个RDD,RDD与RDD之间的依赖关系
* - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
(可选项)针对于KV类型的RDD才会有分区函数Partitioner,并且必须要产生shuffle
* - Optionally, a list of preferred locations to compute each split on (e.g. block locations for
* an HDFS file)
(可选项) 数据的本地性和数据块位置最优
创建RDD
- 1、通过sc.parallelize,需要一个已经存在scala集合,来生成一个RDD
- val rdd1=sc.parallelize(List(1,2,3,4))
- 2、读取外部数据源
- val rdd2=sc.textFile("/words.txt")
- 3、在已有RDD的基础上操作对应的算子生成新的rdd
- val rdd3=rdd2.flatMap(_.split(" "))
RDD的算子分类
1、Transformation(转换)
- 一个rdd转换之后生成新的RDD,并不会立即执行,得到结果,RDD中的所有转换都是延迟加载的 ,而是记录下当前rdd的一系列操作。
2、Action(动作)
- 会触发任务的真正运行
RDD的依赖关系
-
1、宽依赖
窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用 总结:窄依赖我们形象的比喻为独生子女
-
2、窄依赖
宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition 总结:宽依赖我们形象的比喻为超生
血统
RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
RDD的缓存
可以把rdd保存在内存或者磁盘,避免下次使用的时候,重头在来计算得到。可以通过调用rdd的cache和persist方法进行缓存设置
1、cache
- 它是一个transformation操作,对RDD进行缓存,它不会立即执行,而是触发了action算子操作的时候才会缓存数据,后面如果用到了,该份数据,不需要在重复计算得到,调用cache的时候,其本质是调用了persist方法默认是存放在内存中的,persist(StorageLevel.MEMOEY_ONLY)
2、persist
- 可以选择不同缓存级别来缓存数据
3 、使用说明
- 都需要触发action算子操作,才会触发缓存执行
DAG有向无环图
1 什么是DAG
- DAG(Directed Acyclic Graph)叫做有向无环图,原始的RDD通过一系列的转换就形成了DAG,根据RDD之间依赖关系的不同将DAG划分成不同的Stage(调度阶段)。
2 划分stage
- 1、从最后一个rdd开始往前推,把当前rdd加入到一个stage中,它是最后一个stage。
- 2、遇到窄依赖就把这个rdd加入到本stage中,遇到宽依赖就从宽依赖切开,最后一个stage就结束了。
- 3、然后重新分配一个stage, 按照上面的规则继续向前推,直到最开始的那个rdd,整个划分stage就结束了。
3 stage内部
- 每个stage里面都有一组task, 被保存在taskSet集合中,可以被并行的计算。
- stage与stage之间也存在依赖关系,后面的stage会依赖于前面stage产生的结果,只有前面的stage计算完成后才能运行后面的stage。
checkpoint机制
- 会对数据进行一个持久化操作,保存在hdfs
- 使用的时候:
- 需要sc.setCheckpointdir 来设置一个检查点目录
- 对需要缓存的rdd调用checkpoint
- 注意:同样在执行数据缓存的时候,需要有对应的action算子操作,才会真正触发持久化操作。
- 在做checkpoint操作的时候,此时会先执行对应触发action算子的rdd结果,计算完成之后又会开辟一个新的job来计算设置了checkpoint的rdd的结果。
- 在设置了checkpoint之后,RDD的lineage就改变了。
- 数据恢复的一般顺序
- 先从内存查找,如果设置了缓存,直接从缓存中获取得到,如果没有就从checkpoint中查找,如果也没有,这个时候只能够重新计算得到。
spark的运行架构
task并行运行个数与线程数量有关,与核数无关