当前位置: 首页 > backend >正文

常见的会触发 Shuffle 的操作和方法

推荐阅读:

用统计零花钱的例子解释:Shuffle 是啥?-CSDN博客

用学生成绩统计的例子理解 Shuffle 的底层逻辑(Spark)_shuffle 逻辑-CSDN博客

1. 显式触发 Shuffle 的操作

操作说明示例
groupByKey()按 Key 分组,收集所有值到同一分区rdd.groupByKey()
reduceByKey()按 Key 聚合(虽然会局部聚合,但仍需跨分区汇总)rdd.reduceByKey(_ + _)
join()关联两个 RDD/DataFrame(若未预先分区对齐)rdd1.join(rdd2)
distinct()去重(内部通过 groupBy 实现)rdd.distinct()
repartition()强制重新分区(如增加分区数)rdd.repartition(100)
sortBy() / sortByKey()全局排序(需将所有数据按 Key 重新分区)rdd.sortByKey()
cogroup()多数据集按 Key 联合分组rdd1.cogroup(rdd2)
intersection()取两个 RDD 的交集(需 Shuffle 去重)rdd1.intersection(rdd2)
aggregateByKey()按 Key 聚合(需跨分区汇总)rdd.aggregateByKey(0)(_ + _, _ + _)

2. 隐式触发 Shuffle 的场景

(1) 宽依赖(Wide Dependency)
  • 定义:父 RDD 的一个分区数据被子 RDD 的多个分区依赖(如 groupByKeyjoin)。

  • 示例

    val rdd = sc.parallelize(1 to 100)
    val grouped = rdd.groupBy(x => x % 10)  // 按余数分组,触发 Shuffle
(2) 数据倾斜(Data Skew)
  • 现象:某些分区的数据量远大于其他分区,导致 Shuffle 时部分节点负载过高。

  • 示例

    val skewedRdd = rdd.filter(x => x % 1000 == 0)  // 假设过滤后某些 Key 数据极多

3. 为什么这些操作需要 Shuffle?

以 reduceByKey 为例:

  1. 局部聚合:每个分区内先对相同 Key 的值进行预聚合(如求和)。

  2. 跨分区汇总:将不同分区中相同 Key 的聚合结果传输到同一个分区,最终合并。

    • 例如,Key 为 A 的数据分布在分区1和分区2,需将两个分区的 A 数据合并。


4. 如何避免或优化 Shuffle?

优化方法说明示例
提前局部聚合用 reduceByKey 替代 groupByKeyrdd.reduceByKey(_ + _)
调整分区策略用 repartition 或 coalesce 控制分区数rdd.coalesce(10)
广播小数据集用 broadcast 代替 join(小表广播到大表)broadcast(smallRdd)
预分区(Partitioning)对频繁使用的 RDD 提前分区(如 partitionByrdd.partitionBy(new HashPartitioner(100))
避免数据倾斜对倾斜 Key 加盐(Salt)或拆分处理rdd.map(key => (key + "_salt", value))

一句话总结

Shuffle 操作 = 跨分区重新洗牌数据,常见于分组、排序、关联等场景。优化核心是 减少数据传输量 和 避免不必要的数据移动

http://www.xdnf.cn/news/5456.html

相关文章:

  • 时序约束高级进阶使用详解四:Set_False_Path
  • 学习黑客5 分钟小白弄懂Windows Desktop GUI
  • win10-django项目连接本地mysql
  • 系统思考:个人与团队成长
  • BGP实验练习1
  • Linux系统编程之消息队列
  • 如何重启pycharm中的项目?
  • 基于STM32单片机设计的教室节能照明系统
  • HTML5表格语法格式详解
  • 用浏览器打开pdf,如何使用划词翻译?
  • MySQL 数据操纵与数据库优化
  • tensorflow 1.x
  • 架构思维:通用架构模式_怀疑下游的设计思路与最佳实践
  • 利用“Flower”实现联邦机器学习的实战指南
  • html body 设置heigth 100%,body内元素设置margin-top出滚动条(margin 重叠问题)
  • 从零到精通:探索 GoFrame 框架的 SSE 优势与实战经验
  • 进程(沉淀中)
  • 运动员技术等级分为国际级运动健将
  • uniapp-商城-52-后台 商家信息(商家信息数据,云对象使用)
  • Java学习手册:服务注册与发现
  • 应急响应基础模拟靶机-security2
  • 咨询规划:精读53页信息化部门如何制定三年战略规划方案【附全文阅读】
  • 660先生与我——高等数学水平自测一、高等数学水平自测二
  • AugmentCode 非常昂贵的新定价
  • 第二十三节:图像金字塔- 图像金字塔应用 (图像融合)
  • 一个.Net开源的关系管理系统
  • 7系列 之 SelectIO 资源
  • Python Cookbook-7.10 在 MySQL 数据库中储存 BLOB
  • Linux网络基础 -- 局域网,广域网,网络协议,网络传输的基本流程,端口号,网络字节序
  • 弹性Reasoning!通过RL训练控制推理预算,提升模型的推理能力和效率!