• 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的关系。

  • 相关阅读:
    深入浅出C#结构体——封装以太网心跳包的结构为例
    视频在线率统计——基于驱动总线设备的领域驱动设计方法落地
    在net Core3.1上基于winform实现依赖注入实例
    类与结构体性能对比测试——以封装网络心跳包为例
    基于Modbus三种CRC16校验方法的性能对比
    Git在公司内部的使用规范
    基于abp框架的数据库种子数据初始化
    VUE中登录密码显示与隐藏的最简设计——基于iview
    abp框架运行——前后端分离(基于VUE)
    基于HTTPS的接口测试——nginx配置SSL
  • 原文地址:https://www.cnblogs.com/wh984763176/p/13435436.html
Copyright © 2020-2023  润新知