Spark---RDD算子的依赖关系

Spark之RDD算子的依赖关系


文章目录

  • Spark之RDD算子的依赖关系
  • RDD 血缘关系
  • RDD 依赖关系
    • RDD 窄依赖
    • RDD 宽依赖


RDD 血缘关系

RDD 只支持粗粒度转换,即在大量记录上执行的单个操作。将创建 RDD 的一系列 Lineage血统)记录下来,以便恢复丢失的分区。RDD 的 Lineage 会记录 RDD 的元数据信息和转换行为,当该 RDD 的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
以WordCount为例

 def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordcount")
    val sc = new SparkContext(conf)
    val line: RDD[String] = sc.textFile("datas/1.txt")
    //打印血缘关系
    println(line.toDebugString)
    println("======================")
    val words: RDD[String] = line.flatMap(_.split(" "))
    //打印血缘关系
    println(words.toDebugString)
    println("======================")
    val wordToOne: RDD[(String, Int)] = words.map((_, 1))
    //打印血缘关系
    println(wordToOne.toDebugString)
    println("======================")
    val wordToSum: RDD[(String, Int)] = wordToOne.reduceByKey(_ + _)
    //打印血缘关系
    println(wordToSum.toDebugString)
    println("======================")
    val array: Array[(String, Int)] = wordToSum.collect()
    array.foreach(println)
  }

Spark---RDD算子的依赖关系_第1张图片

Spark---RDD算子的依赖关系_第2张图片

  • 相邻的两个RDD的关系称之为依赖关系,例如:RDD1和RDD2
  • 新的RDD依赖旧的RDD,例如:val mapRdd=rdd.map((_,1)),mapRdd依赖于rdd
  • 多个连续的RDD的依赖关系,称之为血缘关系
    假设出现部分分区数据丢失时
  • RDD不会保存数据
  • 但为了提供容错性,需要将RDD间的关系保存下来,一旦出现错误,可以根据血缘关系将数据源重新进行计算
    Spark---RDD算子的依赖关系_第3张图片

RDD 依赖关系

这里所谓的依赖关系,其实就是两个相邻 RDD 之间的关系
以WordCount为例

def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordcount")
    val sc = new SparkContext(conf)

    val line: RDD[String] = sc.textFile("datas/1.txt")
    //打印依赖关系
    println(line.dependencies)
    println("======================")
    val words: RDD[String] = line.flatMap(_.split(" "))
    //打印依赖关系
    println(words.dependencies)
    println("======================")
    val wordToOne: RDD[(String, Int)] = words.map((_, 1))
    //打印依赖关系
    println(wordToOne.dependencies)
    println("======================")
    val wordToSum: RDD[(String, Int)] = wordToOne.reduceByKey(_ + _)
    //打印依赖关系
    println(wordToSum.dependencies)
    println("======================")

    val array: Array[(String, Int)] = wordToSum.collect()
    array.foreach(println)
  }

Spark---RDD算子的依赖关系_第4张图片

RDD 窄依赖

窄依赖表示每一个父(上游)RDD 的 Partition 最多被子(下游)RDD 的一个 Partition 使用,窄依赖我们形象的比喻为独生子女
OneToOneDependency

Spark---RDD算子的依赖关系_第5张图片
新的RDD的一个分区数据依赖于旧的RDD一个分区数据
这个依赖称为窄依赖

RDD 宽依赖

宽依赖表示同一个父(上游)RDD 的 Partition 被多个子(下游)RDD 的 Partition 依赖,会引起 Shuffle,总结:宽依赖我们形象的比喻为多生
ShuffleDependency

Spark---RDD算子的依赖关系_第6张图片
新的RDD的一个分区的数据依赖于旧的RDD多个分区的数据,这个依赖称为宽依赖

你可能感兴趣的:(Spark,spark,scala,大数据)