zoukankan      html  css  js  c++  java
  • Spark宽依赖、窄依赖

    在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)优化。
  • 相关阅读:
    django学习第85天Django的Ajax
    django学习第84天Django常用字段和参数
    django学习第83天Django聚合查询.分组查询.FQ查询
    django学习第82天Django多表查询
    django学习第81天Django模板层2(单表查询.模块的导入和继承.静态文件配置)
    django学习第80天Django模板层1
    django学习第79天Django视图层
    Linux 内核文档翻译
    Linux设备模型——设备驱动模型和sysfs文件系统解读
    内核空间内存申请函数kmalloc kzalloc vmalloc的区别
  • 原文地址:https://www.cnblogs.com/chenshaowei/p/12376360.html
Copyright © 2011-2022 走看看