spark的RDD、DAG、shuffle等一些知识点的整合

RDD的依赖关系

RDD和它依赖的父RDD的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency)。

窄依赖:

窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用(子rdd当中一个分去里面的数据来源于父rdd当中一个分区。叫做窄依赖。实际上没有产生shuffle过程)

宽依赖
宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition(子rdd当中一个分区里面的数据来源于父rdd当中好几个分区。实际上就是产生了shuffle,叫做宽依赖。)

对比图如下:
在这里插入图片描述

如何划分宽窄依赖:有没有产生shuffle过程

血统lineage:RDD只支持粗粒度转换,即只记录单个块上执行的单个操作。将创建RDD的一系列Lineage(即血统)记录下来,以便恢复丢失的分区。RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。根据rdd之间的依赖关系,将依赖关系给记录下的血统。血统的记录可以帮助我们做容错。
例如:

  rdd1  ==>  rdd2  ==>  rdd3  ==>  rdd4
 记录下来每一个rdd的父rdd是谁,也记录下来每一个rdd的子rdd是谁
 可以帮助我们做容错
 rdd3数据丢失:rdd2.map   =rdd3 

RDD的缓存

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

  主要有两种,cache方法和persist方法但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。

查看 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值