目录
RDD的血缘
概述
RDD可以从本地集合并行化、从外部文件系统、其他RDD转化得到,能从其他RDD通过Transformation创建新的RDD的原因是RDD之间有依赖关系(Dependency代表了RDD之间的依赖关系,即血缘(Lineage)),RDD和他依赖的父RDD有两种不同的类型,即宽依赖(wide dependency)和窄依赖(narrow dependency)。
划分依赖的背景
- 从计算过程,窄依赖是数据以管道的方式经一系列计算操作可以运行在一个集群节点上,,例如:map、filter。宽依赖则可能需要将数据跨节点传输后运行(如groupByKey),有点类似于MR的shuffle过程。
- 从失败恢复来看,窄依赖恢复起来更高效,因为他只需要找到父RDD的一个对应分区即可,而且可以在不同节点上并行计算做恢复。宽依赖则牵扯到父RDD的多个分区,恢复起来相对复杂一些。
- 在这里我们引入一个新的概念,Stage。Stage可以简单的理解为是由一组RDD组成的可进行优化的执行计划。若RDD的衍生关系为窄依赖,则可以放在同一个stage中运行。若RDD的依赖关系为宽依赖,则要划分到不同的Stage中。这样Spark在执行任务时,会按照Stage的划分,生成一个完整的最优的执行计划。
划分以来的依据
划分宽依赖和窄依赖的关键点在:分区的依赖关系。
也就是说父RDD的一个分区的数据,是给子RDD的一个分区,还是给子RDD的所有分区。
父RDD的每一个分区,是被一个子RDD的一个分区依赖(一对一),就是窄依赖。
如果父RDD的每一个分区,是被子RDD的各个分区所依赖(一对多),就是宽依赖。
一旦有宽依赖发生,就意味着会发生数据的shuffle。发生了shuffle也就意味着生成了新的stage。
窄依赖
窄依赖是指父RDD的一个分区,被子RDD的一个分区所