Spark中的宽窄依赖-宽窄巷子

在Spark中,宽窄依赖(Narrow and Wide Dependencies)是理解分布式计算和数据流动的关键概念,其特性与"宽窄巷子"的比喻有相似之处:

1、什么是依赖关系?

2、什么是宽窄依赖?

窄依赖:Narrow Dependencies

定义:父RDD的一个分区的数据只给了子RDD的一个分区 【 不用经过Shuffle

窄依赖(Narrow Dependency)

  • 定义 :子RDD的每个分区仅依赖于父RDD的一个分区 (如mapfilter操作)。
  • 特点
    • 数据无需跨节点移动(本地计算)

    • 高效且容错简单(只需重算单个分区)

    • 类似窄巷子:数据流单向、并行,无交叉

      窄依赖示例:map操作

      rdd = sc.parallelize([1, 2, 3])
      mapped = rdd.map(lambda x: x * 2) # 子分区仅依赖父RDD的同一分区

宽依赖(Wide Dependency)

  • 定义 :子RDD的每个分区依赖父RDD的多个分区 (如groupByKeyreduceByKey)。
  • 特点
    • Shuffle操作(数据跨节点重组)

    • 可能成为性能瓶颈(网络传输开销)

    • 类似宽巷子:多路数据汇聚交叉,需全局协调

      宽依赖示例:reduceByKey

      rdd = sc.parallelize([("a", 1), ("b", 2), ("a", 3)])
      reduced = rdd.reduceByKey(lambda x, y: x + y) # 相同键的数据需从多分区聚合

性能优化建议

  1. 优先使用窄操作 :如用reduceByKey替代groupByKey(前者局部聚合减少Shuffle数据量)
  2. 调整分区数 :通过repartition()coalesce()控制Shuffle粒度
  3. 持久化中间结果 :对重复使用的宽依赖RDD调用persist()

数学表达补充

设RDD分区为集合P,依赖关系可形式化定义为: \\text{窄依赖:} \\quad \\forall p_i \\in P_{\\text{子}}, \\ \\exists! p_j \\in P_{\\text{父}} \\quad \\text{s.t.} \\quad p_i \\subseteq f(p_j) \\text{宽依赖:} \\quad \\exists p_i \\in P_{\\text{子}}, \\ \\ \|{p_j \\in P_{\\text{父}} \\mid p_i \\cap p_j \\neq \\emptyset}\| \> 1 其中f为转换函数。

相关推荐
数商云企7 分钟前
2026年西安电商智能客服开发选数商云企,技术稳交付快
大数据·python
m0_547486667 分钟前
《大数据应用软件工程》全套PPT课件2026
大数据·软件工程
clz131452115 分钟前
风险特征系统 EPC 子系统:基于 Kafka 数据源与数据集配置的 Flink 指标清洗加工
分布式·flink·kafka
cspttty31 分钟前
2026市场分析师校招能力模型:SQL、Excel、BI与业务分析
大数据·数据库
hfywmsj39 分钟前
广州餐饮铺位招租决策模型:从流量评估到合同风控的技术拆解
大数据·人工智能·广州餐饮铺位招租
cc57250265343 分钟前
2026 秋招直播运营岗位招聘 JD 拆解,数据指标与数据分析能力备考思路
大数据·数据挖掘·数据分析
阡陌数智1 小时前
LiteLLM 开源网关实践:能力边界与生产环境改造要点
大数据·人工智能·开源·prompt·软件工程
数智化码农1 小时前
半导体制造人力资源数字化选型:适配双用工体系,兼顾合规与人效
大数据·运维·python·制造
电梯界知识分子1 小时前
江西抚州临川九尊府五层别墅:受限楼梯间里,全黑铝合金观光井道配曳引龙门架的落地记录
大数据·前端·网络·算法·家用电梯
海上小飞龙1 小时前
分布式和微服务,一次讲清
分布式·微服务·架构