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

最新文章

  1. mysql安装流程
  2. CSS 派生选择器
  3. 【转】【C#】【Thread】【Parallel】并行计算
  4. C#中结构体和类的区别
  5. java中replace和replaceAll的区别
  6. Test Tools
  7. Command-line interface
  8. PHP上传文件DEMO
  9. Go package(1) time 用法
  10. 5.6Python数据处理篇之Sympy系列(六)---矩阵的操作
  11. Go-day03
  12. JAVA中经过nginx反向代理获取客户端ip并获取相关坐标等信息
  13. [daily] 像tcpdump一样监听unix domain socket
  14. RedHat7安装vmware虚拟机启动报错
  15. 计算机网络——链路层协议
  16. Java中的null
  17. ffmpeg应用笔记
  18. ceph修复osd为down的情况
  19. Android Hander、Looper、Message三者之间的联系
  20. msp430项目编程51

热门文章

  1. 理解ASP.NET Core - 文件服务器(File Server)
  2. python教程-(三)使用字符串
  3. centos安装pm2报错
  4. Redis源码分析(sds)
  5. 计算机网络漫谈之IP与子网掩码
  6. 03 | 变量的解构赋值 | es6
  7. 微信小程序(三)开发框架
  8. 微信小程序(二)
  9. 面试官问我Redis集群,我真的是
  10. 1-Introduction(介绍)