在Spark中,RDD(弹性分布式数据集)存在依赖关系,宽依赖和窄依赖。

宽依赖和窄依赖的区别是RDD之间是否存在shuffle操作。

窄依赖

窄依赖指父RDD的每一个分区最多被一个子RDD的分区所用,即一个父RDD对应一个子RDD或多个父RDD对应一个子RDD

  • map,filter,union属于窄依赖
  • 窄依赖对于流水化作业有优化效果
  • 每一个RDD算子都是一个fork/join操作,join会写入磁盘,流水线作业优化后fork,中间不join写入磁盘

宽依赖

宽依赖指子RDD的每个分区都依赖于父RDD的多个分区

  • groupby和join属于宽依赖
  • DAGScheduler从当前算子往前推,遇到宽依赖,就生成一个stage

分区划分规则

  1. 分区如何划分
  2. 分区该放到集群内哪个节点

Spark默认两种划分器:HashPartitioner和RangePartitioner

宽依赖、窄依赖的概念不仅用在调度,对容错也有用,如果一个节点损坏,运算是窄依赖,只要把丢失的父节点分区重新计算即可。而宽依赖的话,就需要使用checkpoint来检查和重新计算。
逻辑上,每个RDD的算子都是一个fork/join(此join非上文的join算子,而是指同步多个并行任务的barrier):把计算fork到每个分区,算完后join,然后fork/join下一个RDD的算子。如果直接翻译到物理实现,是很不经济的:一是每一个RDD(即使 是中间结果)都需要物化到内存或存储中,费时费空间;二是join作为全局的barrier,是很昂贵的,会被最慢的那个节点拖死。如果子RDD的分区到 父RDD的分区是窄依赖,就可以实施经典的fusion优化,把两个fork/join合为一个;如果连续的变换算子序列都是窄依赖,就可以把很多个 fork/join并为一个,不但减少了大量的全局barrier,而且无需物化很多中间结果RDD,这将极大地提升性能。Spark把这个叫做流水线(pipeline)优化。

最新文章

  1. hihocoder-1014 Trie树
  2. JS/CSS收藏
  3. 那些年一起用过的iOS开发利器[4月2号更新]
  4. [delphi]向ImageList中加入png类型的资源图片
  5. 如何彻底卸载Oracle
  6. 小红伞和virtualbox5.0.10冲突
  7. 云计算分布式大数据Hadoop实战高手之路第七讲Hadoop图文训练课程:通过HDFS的心跳来测试replication具体的工作机制和流程
  8. [反汇编练习] 160个CrackMe之004
  9. MyEclipse 启动tomcat时报错:Cannot change deployment state from ERROR to REDEPLOYING.ds
  10. Emoji表情处理
  11. ASP.NET-FineUI开发实践-8
  12. spark Intellij IDEA开发环境搭建
  13. 用Backtrack进行渗透测试评估
  14. Ajax的方法和使用代码
  15. ①【javascript设计到的技术点】
  16. js中的传值和传引用,判断两个数组是否相等
  17. Javascript高级编程学习笔记(66)—— 事件(10)变动事件
  18. C# winfrom容器布局与工具栏&&右键菜单栏&&隐藏显示小图标的的简单事件
  19. 修改 iis 的端口号: 80 与 443
  20. PAT甲题题解-1010. Radix (25)-二分搜索

热门文章

  1. kettle将csv文件导入数据库
  2. swiper实现匀速无缝滚动
  3. poj_2406 KMP寻找重复子串问题
  4. Unity 协程运行时的监控和优化
  5. VMware HA、FT、VADP、SRM、VR、vMotion
  6. HTTP协议(一):概述
  7. 字符串处理 - ANSI - Unicode - UTF8 转换
  8. EF Core开发模式之Code First
  9. HTML5 可缩放矢量图形(2)—SVG基础
  10. 吴裕雄--天生自然C++语言学习笔记:C++简介