Spark RDD之Dependency
来源:互联网 发布:魔兽世界tbc数据库 编辑:程序博客网 时间:2024/05/19 00:46
概要
上一篇我们介绍了代表RDD组成的(Dependency、Partition、Partitioner)之一的Partition,这篇接着介绍Dependency。Partition记录的是数据split的逻辑,Dependency记录的是transformation操作过程中Partition的演化,即这个Partition从哪来到哪去的过程,以及通过Dependency的类型判断如何处理数据,即pipeline还是shuffle。
Dependency定义
我的另一篇博客Spark RDD中介绍了RDD的组成,及Dependency的分类以及缘由,这里不再累述,先看下Dependency的定义:
Dependency是抽象类,有一个属性rdd,就是对应RDD的父RDD,所以Dependency就是对父RDD的包装,并且通过Dependency的类型说明当前这个transformation对应的数据处理方式,其主要子类实现,即Dependency的类型有两大类:
- NarrowDependency(窄依赖)
窄依赖依然是抽象类,继承了rdd,并在定义中增加抽象方法getParents,根据子RDD的PartitionId返回对应的父RDD的PartitionId,接下来查看窄依赖的具体实现:- OneToOneDependency
OneToOneDependency表示子RDD和父RDD的Partition之间的关系是1对1的,即子RDD的PartitionId和父RDD的PartitionId一样,如第一幅图中,Narrow Dependency下面的map和filter方法所示的关系。 - RangeDependency
RangeDependency表示子RDD和父RDD的Partition之间的关系是一个区间内的1对1对应关系,第一幅图中所示Narrow Dependency下面的union就是RangeDependency - PruneDependency
子RDD的Partition来自父RDD的多个Partition,filterByRange方法时会使用,不做详细讨论
- OneToOneDependency
- ShuffleDependency(宽依赖)
ShuffleDependency的定义相对复杂一些,因为shuffle设计到网络传输,所以要有序列化serializer,为了减少网络传输,可以加map端聚合,通过mapSideCombine和aggregator控制,还有key排序相关的keyOrdering,以及重输出的数据如何分区的partitioner,其他信息包括k,v和combiner的class信息以及shuffleId。shuffle是个相对复杂且开销大的过程,Partition之间的关系在shuffle处戛然而止,因此shuffle是划分stage的依据。
Dependency分为两大类,宽依赖和窄依赖,窄依赖有两个主要实现。
举个例子
以Wordcount为例
val wordcount = sc.parallelize(List("a c", "a b"))wordcount.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect()
通过web UI查看DAG,如下:
可以看出,其根据shuffle的位置划分为两个stage,stage0和stage1
调用toDebugString查看各RDD之间关系
最后,总结出Wordcount中RDD及其对应的Dependency如下,其中方形代表RDD,圆角矩形代表Partition(3个圆角矩形是为了作图方便,不代表其具体有3个Partition),文本框内第一行为代码片段,第二行是对应的RDD,第三行为RDD的Dependency类型
总结
Dependency是RDD的重要组成,分为宽依赖和窄依赖两大类,实质就是其父RDD的包装,由Dependency组成的关系构成了lineage的物理结构,也是DAG的物理结构,宽依赖(即shuffle操作)是stage划分的依据,窄依赖可以执行流水线(pipeline)操作,效率高。
- Spark RDD之Dependency
- Spark源码解读之RDD依赖Dependency
- RDD Dependency详解---Spark学习笔记9
- Spark分析之Dependency
- spark之RDD
- spark之RDD
- Spark之RDD编程
- Spark之RDD基础
- spark之RDD
- Spark RDD之Partition
- Spark RDD之Partitioner
- Spark之RDD
- spark之RDD
- Spark 之 RDD
- Spark RDD之Partition
- Spark RDD之入门理解
- spark之RDD(四)
- spark之RDD基本转换
- Android 系列 6.17使用Attributes和TextWatcher接口约束EditText值
- Java加密技术(三)——PBE算法
- EntityFrameWork Code First 多数据库以及自定义字符串的使用+连接字符串加密调用
- 【STL】 poj1208&&UVa101 The Blocks Problem (不定长数组vector的应用)
- MSSQL手注语句
- Spark RDD之Dependency
- JAVA 基本数据类型长度
- halcon学习之仿射变换1
- [BZOJ2223][Coci 2009]PATULJCI(整体二分+bit)
- CSS3初步
- Opencv学习笔记(九)光流法
- Java加密技术(四)——非对称加密算法RSA
- oracle 表更新的一次奇异经历(二)
- android.os.NetworkOnMainThreadException异常解决