RDD的依赖关系
- 窄依赖
- 父RDD中每一个partition最多只被子RDD的一个partition所使用
- 总结:窄依赖我们形象的比喻为独生子女
- 宽依赖
- 子RDD的多个partition会依赖于父RDD同一个partition
- 总结:宽依赖我们形象的比喻为超生
Lineage(血统)
- 记录下RDD的元数据信息和转换行为,如果当前一个RDD的某些分区数据丢失后,可以根据血统,重新计算恢复得到丢失的分区数据。
RDD的缓存
- persist
- 也可以把数据进行缓存,并且提供丰富的缓存级别
- cache
- 默认将数据保存在内存中,其本质最终还是调用persist(StorageLevel.MEMORY_ONLY)
- 对需要进行缓存的RDD调用persist和cache,它并不会立即执行缓存操作,需要后面有对应的action算子的时候,才会真正执行缓存操作。
DAG有向无环图
- DAG(Directed Acyclic Graph)叫做有向无环图,原始的RDD通过一系列的转换就形成了DAG,根据RDD之间依赖关系的不同将DAG划分成不同的Stage(调度阶段)。对于窄依赖,partition的转换处理在一个Stage中完成计算。对于宽依赖,由于有Shuffle的存在,只能在parent RDD处理完成后,才能开始接下来的计算。
- 因此宽依赖是划分Stage的依据。
checkpoint
- 提供了一个相对而言更加可靠的持久化数据方式
- 使用checkpoint
- 1.sparkContext.setCheckpointDir(“hdfs上目录”)
- 2.针对于需要缓存的rdd数据调用
- rdd.checkpoint
- 并不是调用checkpoint方法后,立即执行数据持久化操作,同样它也需要后续使用了action操作,才会触发任务的运行。
- 3、在运行的时候首先会先执行action这样一个job,执行完成之后,会单独开启一个新的job来执行checkpoint
- persist、cache、checkpoint区别
- persist和cache同样可以对数据进行持久化,持久化之后,之前的血统没有发生任何改变,如果数据丢失,它是可以通过血统重新计算恢复得到。
- checkpoint在持久化数据会,依赖关系已经发生该了。这个时候如果数据丢失了,它不能都通过重复计算恢复得到。
- 丢失数据恢复的一般流程
- 首先会去cache获取,如果有,直接拿到,如果没有,需要去checkpoint查询,如果有,直接拿到,如果没有,这个就需要重新计算得到。