在Spark中,每一个RDD是对于数据集在某一状态下的表现形式,比如说:map、filter、group by等都算一次操作,这个状态有可能是从前一状态转换而来的;

因此换句话说一个RDD可能与之前的RDD(s)有依赖关系;RDD之间存在依赖关系;

根据依赖关系的不同,可以将RDD分成两种不同的类型:宽依赖和窄依赖

窄依赖:一个父RDD的partition至多被子RDD的某个partition使用一次

宽依赖:一个父RDD的partition会被子RDD的partition使用多次,需要shuffle操作

图中方框描述:外面的大方框是一个RDD,里面的小方块是RDD中的partition,多个partition组成一个RDD

窄依赖

定义:一个父RDD的partition至多被子RDD的某个partition使用一次
不需要shuffle,partition范围不会改变,一个partition经过transform后还是一个partition,虽然内容发生了变化;可以进行pipeline计算,快速完成;

在某个节点上可以一次性全部计算完所有的父partition(pipeline流水式的计算方式):

a.map().filter().reduceByKey() 这样多步操作一次性计算完毕,而不需要第一步执行完后保存起来,第二步再去读取再计算再存储。。。。。。

窄依赖可以在单节点上完成运算,非常高效。

容错:某个partition挂了,快速将丢失的partition并行计算出来

容错和计算速度都比宽依赖强。

窄依赖又分为两种:

OneToOneDependency:一对一的依赖,一父一子,最典型的是map/filter。

RangeDependency:一定范围的RDD直接对应,最典型的是Union。

  parent RDD的某个分区的partitions对应到child RDD中某个区间的partitions;
  union:多个parent RDD合并到一个chind RDD,故每个parent RDD都对应到child RDD中的一个区间;
  注意:union不会把多个partition合并成一个partition,而是简单的把多个RDD的partitions放到一个RDD中,partition不会发生变化。

宽依赖

定义:一个父RDD的partition会被子RDD的partition使用多次;只能前面的算好后才能进行后续的计算;只有等到父partition的所有数据都传输到各个节点后才能计算(经典的mapreduce场景)

容错:某个partition挂了,要计算前面所有的父partition,代价很大

spark是把map部分的数据计算完成后物化到map端的磁盘上,挂了之后直接从磁盘中读取即可。

class ShuffleDependency[K, V](
@transient rdd: RDD[_ <: Product2[K, V]],
val partitioner: Partitioner,
val serializerClass: String = null)
extends Dependency(rdd.asInstanceOf[RDD[Product2[K, V]]]) {
val shuffleId: Int = rdd.context.newShuffleId()
}

首先:需要基于PairRDD,因为一般需要依据key进行shuffle,所以数据结构往往是key-value;
其次:由于需要shuffle,所以就需要给出partitioner;
然后:shuffle不像map可以在local运行,往往需要网络传输或存储,所以需要serializerClass;
最后:每个shuffle需要分配一个全局的id,context.newShuffleId()的实现就是把全局id累加;

Spark分析之Dependency的更多相关文章

  1. [大数据从入门到放弃系列教程]第一个spark分析程序

    [大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...

  2. 使用Spark分析拉勾网招聘信息(一):准备工作

    本系列专属github地址:https://github.com/ios122/spark_lagou 前言 我觉得如果动笔,就应该努力地把要说的东西表达清楚.今后一段时间,尝试下系列博客文章.简单说 ...

  3. 使用Spark分析拉勾网招聘信息(四): 几个常用的脚本与图片分析结果

    概述 前一篇文章,已经介绍了BMR的基础用法,再结合Spark和Scala的文档,我想应该是可以开始你的数据分析之路的.这一篇文章,着重进行一些简单的思路上的引导和分析.如果你分析招聘数据时,卡在了某 ...

  4. 使用Spark分析拉勾网招聘信息(三): BMR 入门

    简述 本文,意在以最小的篇幅,来帮助对大数据和Spark感兴趣的小伙伴,能尽快搭建一个可用的Spark开发环境.力求言简意赅.文章,不敢自称BMR的最佳实践,但绝对可以帮助初学者,迅速入门,能够专心于 ...

  5. 使用Spark分析拉勾网招聘信息(二): 获取数据

    要获取什么样的数据? 我们要获取的数据,是指那些公开的,可以轻易地获取地数据.如果你有完整的数据集,肯定是极好的,但一般都很难通过还算正当的方式轻易获取.单就本系列文章要研究的实时招聘信息来讲,能获取 ...

  6. Spark分析之Job Scheduling Process

    经过前面文章的SparkContext.DAGScheduler.TaskScheduler分析,再从总体上了解Spark Job的调度流程 1.SparkContext将job的RDD DAG图提交 ...

  7. Spark分析之TaskScheduler

    TaskScheduler概述: TaskScheduler是一个可插拔任务调度接口,通过不同的SchedulerBackend进行任务的调度.主要功能如下: 1.一个TaskScheduler只为一 ...

  8. Spark分析之SparkContext启动过程分析

    SparkContext作为整个Spark的入口,不管是spark.sparkstreaming.spark sql都需要首先创建一个SparkContext对象,然后基于这个SparkContext ...

  9. Spark分析之DAGScheduler

    DAGScheduler概述:是一个面向Stage层面的调度器: 主要入参有: dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, ...

随机推荐

  1. MySQL配置优化需要避免的误区

    Caution: Don't overwrite your entire my.cnf at once when tuning MySQL. One or two changes per restar ...

  2. 安装python第三方库

    前言 接触python编程很晚,基础语法比较好理解,但是用起来还是需要用心的,特别是可能会用到许多第三方库,本文就介绍一下python第三方库的安装. 环境 系统环境:win7_64; Python版 ...

  3. Springboot中的连接池

    pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...

  4. CodeForces - 1093G:Multidimensional Queries (线段树求K维最远点距离)

    题意:给定N个K维的点,Q次操作,或者修改点的坐标:或者问[L,R]这些点中最远的点. 思路:因为最后一定可以表示维+/-(x1-x2)+/-(y1-y2)+/-(z1-z2)..... 所以我们可以 ...

  5. Html页面Dom对象之Element

    HTML DOM Element 对象 HTML DOM 节点 在 HTML DOM (文档对象模型)中,每个部分都是节点: 文档本身是文档节点 所有 HTML 元素是元素节点 所有 HTML 属性是 ...

  6. makefile,让编译更简单

    陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的 ...

  7. pandas 基础用法

    pandas 是一个基于 Numpy 构建, 强大的数据分析工具包 主要功能 独特的数据结构 DataFrame, Series 集成时间序列功能 提供丰富的数学运算操作 灵活处理缺失数据 Serie ...

  8. yugabyte 集成JanusGraph测试

    yugabyte 集成图数据库JanusGraph,原理比较简单就是yugabyte 内置Cassandra,配置好JanusGraph 的访问就可以了. 使用docker 模式部署 创建yugaby ...

  9. flash TweenMax用法

    二,TweenMax主类: 这里分几个大块来介绍,分别是:第三个参数特有属性(29个),PlugIn(17个),公共属性(10个),公共方法(20个). 1,第三个参数特有属性(29个): 这29个参 ...

  10. Oracle GI 日志收集工具 - TFA 简介

    转载自:https://blogs.oracle.com/Database4CN/entry/tfa_collector_%E4%BB%8B%E7%BB%8D 1.TFA的目的: TFA是个11.2版 ...