zoukankan      html  css  js  c++  java
  • Spark 源码解读 -- 依赖

    窄依赖

    所谓窄依赖就是说子RDD中的每个分区(partition)只依赖于父RDD中有限个数的partition。在API中解释如下:

      

    窄依赖在代码中有两种具体实现,一种是一对一的依赖:OneToOneDependency,从其getparent方法中不难看出,子RDD只依赖于父 RDD相同ID的Partition。

    另外一种是范围的依赖,RangeDependency,它仅仅被org.apache.spark.rdd.UnionRDD使用。UnionRDD是把多个RDD合成一个RDD,这些RDD是被拼接而成,即每个父RDD的Partition的相对顺序不会变,只不过每个父RDD在UnionRDD中的Partition的起始位置不同。代码如下:

     其中,inStart是父RDD中Partition的起始位置,outStart是在UnionRDD也就是子RDD中的起始位置,length就是父RDD中Partition的数量。

    宽依赖

    而宽依赖指的是子RDD的每一个partition都依赖于父 RDD中的所有partition(未必所有父RDD中的partition都提供数据,但是依赖关系一定)。

    宽依赖的实现只有一种:ShuffleDependen, API 定义如下:

    宽依赖需要向shuffleManager注册shuffle的信息。宽依赖支持两种Shuffle Manager,即org.apache.spark.shuffle.hash.HashShuffleManager(基于Hash的Shuffle机制)和org.apache.spark.shuffle.sort.SortShuffleManager(基于排序的Shuffle机制)

    总结一下:

    实现上:对于窄依赖,rdd之间的转换可以直接pipe化,而宽依赖需要采用shuffle过程来实现。
    任务调度上:窄依赖意味着可以在某一个计算节点上直接通过父RDD的某几块数据(通常是一块)计算得到子RDD某一块的数据; 而相对的,宽依赖意味着子RDD某一块数据的计算必须等到它的父RDD所有数据都计算完成之后才可以进行,而且需要对父RDD的计算结果需要经过shuffle才能被下一个rdd所操作。
    容错恢复上:窄依赖的错误恢复会比宽依赖的错误恢复要快很多,因为对于窄依赖来说,只有丢失的那一块数据需要被重新计算, 而宽依赖意味着所有的祖先RDD中所有的数据块都需要被重新计算一遍,这也是我们建议在长“血统”链条特别是有宽依赖的时候,需要在适当的时机设置一个数据检查点以避免过长的容错恢复。可以使用:RDD.checkpoint的方法来实现检查点

  • 相关阅读:
    git版本回退问题记录
    git add的各种情况分类
    代码优化积累【持续更新】
    package.json和package-lock.json的区别
    new Date在IE下面兼容问题
    git fetch和git pull的区别
    Node.Js的热更新服务——supervisor
    springboot 指定启动环境
    java后台解决上传图片翻转90的问题,有demo,经过测试可用
    intellij IDEA 实用快捷键
  • 原文地址:https://www.cnblogs.com/jiang-Xin/p/5999803.html
Copyright © 2011-2022 走看看