ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**1. 血统** RDD基于Lineage(血统、遗传)保存了RDD的依赖关系,并<mark>基于Lineage实现了容错机制</mark>。 <br/> **2. 窄依赖和宽依赖** RDD的依赖关系只有两种:<mark>窄依赖</mark> 与 <mark>宽依赖</mark>。<br/><br/> :-: ![](https://img.kancloud.cn/3d/5d/3d5df13ea74b2d2ce79ed0eee6d0a6df_942x313.png) 宽依赖与窄依赖 * 宽依赖对比窄依赖 * 宽依赖对应shuffle操作,需要在运行时将同一个父RDD的分区传入到不同的子RDD分区中,不同的分区可能位于不同的节点,就可能涉及多个节点间数据传输。 * 当RDD分区丢失时,Spark会对数据进行重新计算,对于窄依赖只需重新计算一次子RDD的父RDD分区。 * 相比于宽依赖,窄依赖对优化更有利,所以尽可能地避免宽依赖的操作。 **3. 常用算子的依赖关系** ```scala map(窄) flatMap(窄) filter(窄) union(窄) distinct(宽) // 凡是带Key的算子都是宽依赖 reduceByKey(宽) groupByKey(宽) sortByKey(宽) join(宽|窄) // 只能根据情况分析是宽依赖,还是窄依赖 ``` <br/> **4. 依赖的层次结构** ```scala -- 顶级依赖 abstract class Dependency[T] // 窄依赖 abstract class NarrowDependency[T](_rdd: RDD[T]) extends Dependency[T] // 一对一依赖,如 map、filter 操作 class OneToOneDependency[T](rdd: RDD[T]) extends NarrowDependency[T](rdd) // 范围依赖,如 union 操作 class RangeDependency[T] extends NarrowDependency[T](rdd) private[spark] class PruneDependency[T] extends NarrowDependency[T](rdd) // 宽依赖 class ShuffleDependency extends Dependency[Product2[K, V]] ```