Spark(六)【RDD的血缘依赖】

RDD依赖关系

1. RDD血缘关系

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

查看RDD的血缘方法:rdd.toDebugString

示例

/**
 * @description: RDD血缘依赖
 * @author: HaoWu
 * @create: 2020年08月04日
 */
object DependeciedTest {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("RDDTest").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val rdd1 = sc.makeRDD(List(1, 2, 3, 4)).map(x => x)
    println(rdd1.toDebugString)
    println("----------------------")
    val rdd2 = rdd1.map(x=>x)
    println(rdd2.toDebugString)
    println("----------------------")
    val rdd3 = rdd2.groupBy(x=>x)
    println(rdd3.toDebugString)
    println("----------------------")
    rdd3.collect()
  }
}

结果

(8) MapPartitionsRDD[1] at map at DependeciedTest.scala:15 []
 |  ParallelCollectionRDD[0] at makeRDD at DependeciedTest.scala:15 []
----------------------
(8) MapPartitionsRDD[2] at map at DependeciedTest.scala:18 []
 |  MapPartitionsRDD[1] at map at DependeciedTest.scala:15 []
 |  ParallelCollectionRDD[0] at makeRDD at DependeciedTest.scala:15 []
----------------------
(8) ShuffledRDD[4] at groupBy at DependeciedTest.scala:21 []
 +-(8) MapPartitionsRDD[3] at groupBy at DependeciedTest.scala:21 []
    |  MapPartitionsRDD[2] at map at DependeciedTest.scala:18 []
    |  MapPartitionsRDD[1] at map at DependeciedTest.scala:15 []
    |  ParallelCollectionRDD[0] at makeRDD at DependeciedTest.scala:15 []
----------------------

2. 依赖关系

依赖关系: 当前RDD和和父RDD之间的依赖关系

查看依赖关系方法:rdd.dependencies

示例

/**
 * @description: RDD依赖关系
 * @author: HaoWu
 * @create: 2020年08月04日
 */
object DependeciedTest {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("RDDTest").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val rdd1 = sc.makeRDD(List(1, 2, 3, 4))
    println(rdd1.dependencies)
    println("----------------------")
    val rdd2 = rdd1.map(x=>x)
    println(rdd2.dependencies)
    println("----------------------")
    val rdd3 = rdd2.groupBy(x=>x)
    println(rdd3.dependencies)
    println("----------------------")
    rdd3.collect()
  }
}

结果

//不依赖于任何RDD
List()
----------------------
// 1对1(1父1子)依赖  (窄依赖),窄依赖不会划分Stage
List(org.apache.spark.OneToOneDependency@1eaf1e62)
----------------------
//1对N(1父多子)依赖(宽依赖或shuffle依赖),宽依赖会划分Stage
List(org.apache.spark.ShuffleDependency@5fad41be)
----------------------

3. RDD的宽窄依赖

  • 窄依赖 (NarrowDependency)

    每一个父RDD的Partition只能被子RDD的一个Partition使用,窄依赖我们形象的比喻为独生子女。

  • 宽依赖 (ShuffleDependency)

    同一个父RDD的Partition被多个子RDD的Partition依赖,会引起Shuffle,宽依赖我们形象的比喻为多生。

4.任务划分

RDD任务切分中间分为:Application、Job、Stage和Task

  1. Application:初始化一个SparkContext即生成一个Application;

  2. Job:一个Action算子就会生成一个Job;

  3. Stage:Stage等于宽依赖(ShuffleDependency)的个数加1;

  4. Task:一个Stage阶段中,最后一个RDD的分区个数就是Task的个数。

注意:Application->Job->Stage->Task每一层都是1对n的关系。

原文地址:https://www.cnblogs.com/wh984763176/p/13435436.html