【Spark】RDD的依赖关系和缓存相关知识点


RDD的依赖关系

RDD和它依赖的父RDD的关系有两种不同的类型,即窄依赖(narrow dependency)宽依赖(wide dependency)
在这里插入图片描述

宽依赖

宽依赖指的是子RDD中的数据来源于父RDD中的多个分区,其实就是产生了shuffle

窄依赖

窄依赖指的是子RDD中的数据来源于父RDD当中的一个分区,也即没有产生shuffle

血统

Lineage —— 根据rdd之间的依赖关系,将依赖关系给记录下来叫做血统。
比如:

rdd1 ==> rdd2 ==> rdd3 ==> rdd4
记录下来每一个rdd的父rdd是谁,也记录下来每一个rdd的子rdd是谁,可以帮助我们做容灾


RDD缓存

概述

Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或者缓存数据集。当持久化某个RDD后,每一个节点都将把计算分区结果保存在内存中,对此RDD或衍生出的RDD进行的其他动作中重用。这使得后续的动作变得更加迅速。RDD相关的持久化和缓存,是Spark最重要的特征之一。可以说,缓存是Spark构建迭代式算法和快速交互式查询的关键。

缓存方式

通过查看StorageLevel的源码可以拿到

object StorageLevel {
  //不缓存
  val NONE = new StorageLevel(false, false, false, false)
  //只在硬盘缓存
  val DISK_ONLY = new StorageLevel(true, false, false, false)
  //在硬盘缓存两份
  val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
  //只在内存缓存
  val MEMORY_ONLY = new StorageLevel(false, true, false, true)
  //在内存缓存两份
  val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
  //在内存序列化缓存
  val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
  //在内存序列化缓存两份
  val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
  //同时在内存和硬盘缓存
  val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
  //同时在内存和硬盘缓存两份(推荐)
  val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
  //同时在内存和硬盘序列化缓存
  val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
  //同时在内存和硬盘序列化缓存两份
  val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
  //对外内存
  val OFF_HEAP = new StorageLevel(false, false, true, false)
  ......
}

两种方法:
1.cache(),其实底层就是调用了persist,将数据仅仅的放到内存里面去,放一份
2.persist()
 (1)无参,也是将只在内存中缓存一份数据
 (2)带StorageLevel参数,一般选择MEMORY_AND_DISK_2

posted @ 2020-04-13 12:02  _codeRookie  阅读(402)  评论(0编辑  收藏  举报