博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spark中narrow dependency和wide dependency
阅读量:7108 次
发布时间:2019-06-28

本文共 1253 字,大约阅读时间需要 4 分钟。

  hot3.png

根据不同的transformation操作,RDD的依赖可以分为窄依赖 (Narrow Dependency)和宽依赖(Wide Dependency,在代码中为ShuffleDependency)两种类型。

窄依赖指的是生成的RDD中每个partition只依赖于父RDD(s)固定的partition。

宽依赖指的是生成的RDD的每一个partition都依赖于父 RDD(s)所有partition。

窄依赖典型的操作有map, filter, union(特殊)等

宽依赖典型的操作有groupByKey, sortByKey等。

窄依赖的第一个作用,我的理解是可以不用等上一次操作全部做完,每完成一条记录就可以进行下次操作,如map产生一条新纪录马上就做filter

那么对于宽依赖,不能顺序执行,比如groupByKey操作。它需要等所有的计算map,filter都做完,才能做ByKey的计算。

另外,union这个必须要重点提一下。这个操作只能说不一定,记住:不一定。为什么这么说呢。。因为如果你的计算非常少,最后只有一个DAG在计算,那它就是narrow。。。如果是多个DAG,那此时必然是wide,必然要做shuffle。

可以看到,宽依赖往往意味着shuffle操作,这也是Spark划分stage(任务集)的主要边界。对于窄依赖,Spark会将其尽量划 分在同一个stage中,因为它们可以进行流水线计算。

计算方面:

上图详细解释一下Spark中的Stage划分。我们从HDFS中读入数据生成3个不同的RDD,通过一系列 transformation操作后再将计算结果保存回HDFS。可以看到这幅DAG中只有join操作是一个宽依赖,Spark内核会以此为边界将其前 后划分成不同的Stage. 同时我们可以注意到,在图中Stage2中,从map到union都是窄依赖,这两步操作可以形成一个流水线操作,通过map操作生成的 partition可以不用等待整个RDD计算结束,而是继续进行union操作,这样大大提高了计算的效率。

而Hadoop的MapReduce更像是宽依赖,所以Spark引入了窄依赖大大提高了计算速度。

容错方面:

narrow dependencies的失败恢复更有效,因为它只需要重新计算丢失的parent partition即可,而且可以并行地在不同节点进行重计算。而wide dependencies牵涉到RDD各级的多个Parent Partitions。

Reference:

1. http://www.dataguru.cn/article-6585-1.html

2. http://www.flybi.net/question/14203

3. http://www.cnblogs.com/davidwang456/p/5135884.html

转载于:https://my.oschina.net/hosee/blog/633096

你可能感兴趣的文章
java多线程(7)实现一个线程池
查看>>
任务01——谈谈对参加工作室的预期
查看>>
VUE 动态切换列表active样式
查看>>
【转载】线程同步
查看>>
android 流行框架的使用
查看>>
Windows Phone 7中用好Silverlig“.NET研究”ht开发利器
查看>>
互联网周刊:互联网进化论,互联网营销
查看>>
ios11 bug总结
查看>>
cakephp上传组件教程
查看>>
flume【源码分析】分析Flume的启动过程
查看>>
经典算法 Manacher算法详解
查看>>
关于System.out.println()与System.out.print("\n")的区别
查看>>
HRMS(人力资源管理系统)-从单机应用到SaaS应用-架构分析(功能性、非功能性、关键约束)-下篇...
查看>>
2017-2018-2 20155225《网络对抗技术》实验四 恶意代码分析
查看>>
POCO exception
查看>>
JSON语法与JavaScript语法的区别
查看>>
ACID理论
查看>>
VC无闪烁刷屏技术的实现
查看>>
DBUtils使用(对jdbc的封装)
查看>>
JAVA ThreadPoolExecutor(转)
查看>>