欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spark _08窄依赖和宽依赖&stage

程序员文章站 2024-02-19 22:41:58
...

专业术语:

Spark _08窄依赖和宽依赖&stage

窄依赖和宽依赖

RDD之间有一系列的依赖关系,依赖关系又分为窄依赖和宽依赖。

  • 窄依赖

父RDD和子RDD partition之间的关系是一对一的。或者父RDD一个partition只对应一个子RDD的partition情况下的父RDD和子RDD partition关系是多对一的。不会有shuffle的产生。

  • 宽依赖

父RDD与子RDD partition之间的关系是一对多。会有shuffle的产生。

宽窄依赖图理解

Spark _08窄依赖和宽依赖&stage

Spark _08窄依赖和宽依赖&stage

Stage

Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。

     stage是由一组并行的task组成。

  • stage切割规则

切割规则:从后往前,遇到宽依赖就切割stage。

Spark _08窄依赖和宽依赖&stage

 

  • stage计算模式

pipeline管道计算模式,pipeline只是一种计算思想,模式。

 

Spark _08窄依赖和宽依赖&stage

  • 数据一直在管道里面什么时候数据会落地?
  1. 对RDD进行持久化。
  2. shuffle write的时候。
  • Stage的task并行度是由stage的最后一个RDD的分区数来决定的 。
  • 如何改变RDD的分区数?

例如:reduceByKey(XXX,3),GroupByKey(4)

  • 测试验证pipeline计算模式
    val conf = new SparkConf()
    conf.setMaster("local").setAppName("pipeline");
    val sc = new SparkContext(conf)
    val rdd = sc.parallelize(Array(1,2,3,4))
    val rdd1 = rdd.map { x => {
      println("map--------"+x)
      x
    }}
    val rdd2 = rdd1.filter { x => {
      println("fliter********"+x)
      true
    } }
    rdd2.collect()
    sc.stop()