Spark入门篇——RDD的血缘

本文深入探讨Spark中的RDD血缘关系,包括窄依赖和宽依赖的定义及区别,阐述依赖如何影响Stage的划分,并讨论了依赖与容错机制的关系,最后总结了DAG图在Spark计算中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

RDD的血缘

概述

划分依赖的背景

划分以来的依据

窄依赖

宽依赖

 join的依赖

宽依赖

 窄依赖

 依赖与Stage的划分

Stage的类别

 依赖与容错

转换算子中间发生失败

DAG的生成

总结


RDD的血缘

概述

RDD可以从本地集合并行化、从外部文件系统、其他RDD转化得到,能从其他RDD通过Transformation创建新的RDD的原因是RDD之间有依赖关系(Dependency代表了RDD之间的依赖关系,即血缘(Lineage)),RDD和他依赖的父RDD有两种不同的类型,即宽依赖(wide dependency)和窄依赖(narrow dependency)。

划分依赖的背景

  1. 从计算过程,窄依赖是数据以管道的方式经一系列计算操作可以运行在一个集群节点上,,例如:map、filter。宽依赖则可能需要将数据跨节点传输后运行(如groupByKey),有点类似于MR的shuffle过程。
  2. 从失败恢复来看,窄依赖恢复起来更高效,因为他只需要找到父RDD的一个对应分区即可,而且可以在不同节点上并行计算做恢复。宽依赖则牵扯到父RDD的多个分区,恢复起来相对复杂一些。
  3. 在这里我们引入一个新的概念,Stage。Stage可以简单的理解为是由一组RDD组成的可进行优化的执行计划。若RDD的衍生关系为窄依赖,则可以放在同一个stage中运行。若RDD的依赖关系为宽依赖,则要划分到不同的Stage中。这样Spark在执行任务时,会按照Stage的划分,生成一个完整的最优的执行计划。

划分以来的依据

划分宽依赖和窄依赖的关键点在:分区的依赖关系

也就是说父RDD的一个分区的数据,是给子RDD的一个分区,还是给子RDD的所有分区。

父RDD的每一个分区,是被一个子RDD的一个分区依赖(一对一),就是窄依赖。

如果父RDD的每一个分区,是被子RDD的各个分区所依赖(一对多),就是宽依赖。

一旦有宽依赖发生,就意味着会发生数据的shuffle。发生了shuffle也就意味着生成了新的stage。

窄依赖

窄依赖是指父RDD的一个分区,被子RDD的一个分区所

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值