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为转换函数。

相关推荐
前沿AI14 分钟前
东风奕派×中关村科金 | 大模型外呼重塑汽车营销新链路,实现高效线索转化
大数据·人工智能
天若有情67328 分钟前
省市聚力:软件产业的“中国土壤”与“创新脊梁”
大数据·人工智能·microsoft
Knight_AL28 分钟前
Flink 核心算子详解:map / flatMap / filter / process
大数据·python·flink
roman_日积跬步-终至千里41 分钟前
【大数据框架】Calcite 基础概念:从 SQL 到执行计划的思维路径
java·大数据·sql
hellojackjiang20111 小时前
如何保障分布式IM聊天系统的消息有序性(即消息不乱)
分布式·架构·即时通讯·im开发
中科天工1 小时前
智装升级:工业4.0时代的高效包装革命
大数据·人工智能·智能
爱敲代码的憨仔1 小时前
Elasticsearch入门
大数据·elasticsearch·搜索引擎
pusheng20251 小时前
破局跨境电商“安全盲区”:一氧化碳报警器的风险与可靠感知之道
大数据
Alter12301 小时前
海南椰子鸡和宁夏滩羊的拼多多“漂流”:透视地域特产的数字进化论
大数据·人工智能
汽车仪器仪表相关领域1 小时前
全组分精准捕获,台架研发中枢:MEXA-ONE发动机尾气测量装置项目实战全景
大数据·人工智能·功能测试·单元测试·压力测试·可用性测试