sparkDag源码分析--生成

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/better_mouse/article/details/79559239

sparkDag源码分析–生成

Dag生成

dag主要是通过rdd的各种转换生成,如下面rdd的map方法,会生成一个新的Rdd

  //返回一个新的rdd,通过应用一个函数到Rdd的所有元素
  def map[U: ClassTag](f: T => U): RDD[U] = {
    val cleanF = sc.clean(f)
    new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
  }

多个这样的方法(算子)就生成了一个有向无环图Dag(Directed acyclic graph),如下图最左边的部分
这里写图片描述
下面来看一下几个相关的类

RDD

abstract class RDD[T: ClassTag](
    @transient private var _sc: SparkContext,
    @transient private var deps: Seq[Dependency[_]]  //依赖
  ) extends Serializable with Logging {

    //这个构造方法被下面的MapPartitionsRDD使用,map算子就只依赖前面一个RDD
    def this(@transient oneParent: RDD[_]) =
    this(oneParent.context , List(new OneToOneDependency(oneParent)))

    //这个方法默认为deps,但是不同的子类实现是不同的,注意,这里
    //返回的是一个Seq,表示一个rdd的依赖可能有多个,比如 c = a join b 
    //那么 c的依赖就有 a 和 b 了,这种rdd下面会讲到的
    protected def getDependencies: Seq[Dependency[_]] = deps  
  }

MapPartitionsRDD OneToOneDependency

  // map算子会生成MapPartitionsRDD 是Rdd的一个子类,它实现的就是默认的getDependencies 
  //方法
 private[spark] class MapPartitionsRDD[U: ClassTag, T: ClassTag](
    prev: RDD[T],
    f: (TaskContext, Int, Iterator[T]) => Iterator[U],  // (TaskContext, partition index, iterator)
    preservesPartitioning: Boolean = false)
  extends RDD[U](prev) {}

ShuffledRDD ShuffleDependency

  // groupByKey算子会生成ShuffledRDD     
  //构造方法传了一个Nil,进去了,难道shuffleDependency没有依赖?
  //它重写了getDependencies,里面new ShuffleDependency,使用的是prev变量,
class ShuffledRDD[K, V, C](
    @transient var prev: RDD[_ <: Product2[K, V]],
    part: Partitioner)
  extends RDD[(K, C)](prev.context, Nil) {
    override def getDependencies: Seq[Dependency[_]] = {
    List(new ShuffleDependency(prev, part, serializer, keyOrdering, aggregator, mapSideCombine))
  }
  }

CoGroupedRDD OneToOneDependency/ShuffleDependency

//join算子会生成CoGroupedRDD
//CoGroupedRDD,它的getDependencies,会生成多个Dependency,join里面
//可能有OneToOneDependency/ShuffleDependency
class CoGroupedRDD[K](@transient var rdds: Seq[RDD[_ <: Product2[K, _]]], part: Partitioner)
  extends RDD[(K, Array[Iterable[_]])](rdds.head.context, Nil) {

    override def getDependencies: Seq[Dependency[_]] = {
    rdds.map { rdd: RDD[_ <: Product2[K, _]] =>
      if (rdd.partitioner == Some(part)) {
        logDebug("Adding one-to-one dependency with " + rdd)
        new OneToOneDependency(rdd)
      } else {
        logDebug("Adding shuffle dependency with " + rdd)
        new ShuffleDependency[K, Any, CoGroupCombiner](rdd, part, serializer)
      }
    }
  }
}

通过上面的代码,我们知道了再Rdd之间的转换,是通过不断生成新的Rdd,来构成一幅Dag
图的,Rdd与Rdd之间有OneToOneDependency/ShuffleDependency(切分的依据)

展开阅读全文

mybatis-generator源码分析-生成文件下

07-04

<p>n 【目的】n</p>n<p>n 如果您希望弄懂框架的原理,但是苦于不知道如何读框架源码?n</p>n<p>n 希望该课程能够通过带领大家阅读源码的方式,了解源码是如何阅读的。该课程选择了一个比较小,比较简单的框架入门,相信大家应该也用过该工具——mybatis generatorn</p>n<p>n <br /></p>n<p>n 【内容】n</p>n<p>n 该课程内容如下,列出了具体时间,便于复习:n</p>n<p>n 第一课:mybatis-generator源码分析-解析配置n</p>n<p>n <br /></p>n<ul><li>n 这节课分为如下几段:n </li>n</ul><ol><li>n 【00:00-05:00】:介绍源码阅读的方法n </li>n <li>n 【05:00-08:00】:简介<span>mybatis-generator的使用</span>n </li>n <li>n <span>【08:00-27:30】:<span>mybatis-generator包一览</span></span>n </li>n <li>n <span>【27:30-结束】:解析配置源码解读</span>n </li>n</ol><p>n </p><ul><li>n 【总结】所在的位置:1.第一次总结<span>【</span>34:15<span>】</span>。2.第二次总结<span>【</span>52:40<span>】</span>n </li>n <li>n 涉及的【设计思路】和【设计模式】:1.模板模式【15:30】。2.xml解析的对象设计+组合模式:<span>【</span>37:00<span>】</span>。3.策略模式:<span>【</span>45:40<span>】</span>n </li>n </ul><p>n <br /></p>n<p>n 第二课:<span>mybatis-generator源码分析-生成文件</span><span></span>n</p>n<p>n <br /></p>n<ul><li>n <span>这节课分为如下几段:</span>n </li>n</ul><p>n        1. <span>【</span>00:00-10:20<span>】</span>:上节课内容回顾n</p>n<p>n        2. <span>【</span>10:20-42:20<span>】</span>:如何从数据库中获取元数据信息n</p>n<p>n        3. <span>【</span><span>42:20-结束<span>】</span>:生成文件</span>n</p>n<p>n </p><ul><li>n <span><span>【总结】所在的位置:1.第一次总结【37:45】。2.第二次总结【56:25】</span></span>n </li>n <li>n <span><span>涉及的<span>【设计思路】和</span>【设计模式】:1、简单工厂方法模式<span>【35:20】。2、聚合的设计思想【44:00】。</span></span></span>n </li>n </ul><p>n <span><span><span><br /></span></span></span>n</p>n<p>n <span><span><span>第三课:mybatis-generator源码分析-总结</span></span></span>n</p>n<p>n <span><span><span>n </span></span></span></p><ul><li>n 这节课分为如下几段:n </li>n </ul>nn<p>n <span><span><span>        1. 【00:00-01:00】: 设计思路总结</span></span></span>n</p>n<p>n <span><span><span>        2. 【01:00-02:50】:配置解析总结</span></span></span>n</p>n<p>n <span><span><span>        3. <span>【02:50-03:55】</span>: 从数据库获取信息<span>总结</span></span></span></span>n</p>n<p>n <span><span><span><span>        4. <span>【03:55-结束】</span><span>: 文件的生成</span><span>总结</span><br /></span></span></span></span>n</p>n<p>n <span><span><span>        <br /></span></span></span>n</p>

mybatis-generator源码分析-生成文件上

07-04

<p>n 【目的】n</p>n<p>n 如果您希望弄懂框架的原理,但是苦于不知道如何读框架源码?n</p>n<p>n 希望该课程能够通过带领大家阅读源码的方式,了解源码是如何阅读的。该课程选择了一个比较小,比较简单的框架入门,相信大家应该也用过该工具——mybatis generatorn</p>n<p>n <br /></p>n<p>n 【内容】n</p>n<p>n 该课程内容如下,列出了具体时间,便于复习:n</p>n<p>n 第一课:mybatis-generator源码分析-解析配置n</p>n<p>n <br /></p>n<ul><li>n 这节课分为如下几段:n </li>n</ul><ol><li>n 【00:00-05:00】:介绍源码阅读的方法n </li>n <li>n 【05:00-08:00】:简介<span>mybatis-generator的使用</span>n </li>n <li>n <span>【08:00-27:30】:<span>mybatis-generator包一览</span></span>n </li>n <li>n <span>【27:30-结束】:解析配置源码解读</span>n </li>n</ol><p>n </p><ul><li>n 【总结】所在的位置:1.第一次总结<span>【</span>34:15<span>】</span>。2.第二次总结<span>【</span>52:40<span>】</span>n </li>n <li>n 涉及的【设计思路】和【设计模式】:1.模板模式【15:30】。2.xml解析的对象设计+组合模式:<span>【</span>37:00<span>】</span>。3.策略模式:<span>【</span>45:40<span>】</span>n </li>n </ul><p>n <br /></p>n<p>n 第二课:<span>mybatis-generator源码分析-生成文件</span><span></span>n</p>n<p>n <br /></p>n<ul><li>n <span>这节课分为如下几段:</span>n </li>n</ul><p>n        1. <span>【</span>00:00-10:20<span>】</span>:上节课内容回顾n</p>n<p>n        2. <span>【</span>10:20-42:20<span>】</span>:如何从数据库中获取元数据信息n</p>n<p>n        3. <span>【</span><span>42:20-结束<span>】</span>:生成文件</span>n</p>n<p>n </p><ul><li>n <span><span>【总结】所在的位置:1.第一次总结【37:45】。2.第二次总结【56:25】</span></span>n </li>n <li>n <span><span>涉及的<span>【设计思路】和</span>【设计模式】:1、简单工厂方法模式<span>【35:20】。2、聚合的设计思想【44:00】。</span></span></span>n </li>n </ul><p>n <span><span><span><br /></span></span></span>n</p>n<p>n <span><span><span>第三课:mybatis-generator源码分析-总结</span></span></span>n</p>n<p>n <span><span><span>n </span></span></span></p><ul><li>n 这节课分为如下几段:n </li>n </ul>nn<p>n <span><span><span>        1. 【00:00-01:00】: 设计思路总结</span></span></span>n</p>n<p>n <span><span><span>        2. 【01:00-02:50】:配置解析总结</span></span></span>n</p>n<p>n <span><span><span>        3. <span>【02:50-03:55】</span>: 从数据库获取信息<span>总结</span></span></span></span>n</p>n<p>n <span><span><span><span>        4. <span>【03:55-结束】</span><span>: 文件的生成</span><span>总结</span><br /></span></span></span></span>n</p>n<p>n <span><span><span>        <br /></span></span></span>n</p>

没有更多推荐了,返回首页