Spark中stage的划分以及宽窄依赖的详解

1.宽依赖与窄依赖

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

  • 窄依赖
 父RDD和子RDD partition之间的关系是一对一的。或者父RDD一个partition只对应一个子RDD的
 partition情况下的父RDD和子RDD partition关系是多对一的。不会有shuffle的产生。
  • 宽依赖
父RDD与子RDD partition之间的关系是一对多。会有shuffle的产生
  • 宽窄依赖图理解
    在这里插入图片描述

2.stage的划分

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

注:stage是由一组并行的task组成

  1. stage切割规则
    切割规则:从后往前,遇到宽依赖就切割stage。
  2. stage切割理解图
    在这里插入图片描述
  3. stage计算模式
    pipeline:管道计算模式,pipeline只是一种计算思想,模式。
    在这里插入图片描述
    注:pipeline管道计算模式应用于stage的内部,task在完成RDD之间数据的传递是在内存传输的,而且是一条一条的传输, stage与stage之间会发生落地磁盘。反观MapReduce是在磁盘上进行数据的传输,而且传输的是整个要传输的数据,比较缓慢。

数据一直在管道里面什么时候数据会落地?

1.对RDD进行持久化时
当使用persist(StorageLevel.DISK_ONLY)或checkpoint( )持久化算子时,需要落地磁盘
2.shuffle write的时候
reducesByKey过程会经过shuffle操作,因此reducesByKey被称为宽依赖的算子

Stage的并行度由谁决定?

由一个Stage中finalRDD(最后一个RDD)中的partition的个数决定。

如何提高Stage的并行度?

reducesByKey(XXX,numpartition) , join(XX,numpartition)
例如:

	val conf = new SparkConf().setMaster("local").setAppName("test")
	val sc = new SparkContext(conf)
	val rdd = sc.makeRDD(Array(("mage",2),("mage",4),("superman",6),("superman",6)),2)
	rdd.reducesByKey(_+_,4)
	

测试验证pipeline计算模式

	 val conf = new SparkConf()
	    conf.setMaster("local").setAppName("test");
	    val sc = new SparkContext(conf)
	    val rdd = sc.parallelize(Array("a","b","c","d"))
	    val rdd1 = rdd.map ( x => {
	      println("map========"+x)
	      x
	    })
	    val rdd2 = rdd1.filter ( x => {
	      println("fliter********"+x)
	      true
	    }).collect()
	    sc.stop()

打印结果如下:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值