Skip to content
Spark 执行模型与性能优化 · 第 2 篇 / 共 2 篇
领域数据与中间件
专题Spark 专题
当前序列Spark 执行模型与性能优化
阅读位置第 2 篇 / 共 2 篇当前专题第 1 个序列 / 共 3 个序列

Spark Shuffle、数据倾斜和 Join 优化:为什么任务总卡在少数几个 Stage

Spark 任务慢,最常见的原因之一就是:

  • Shuffle 太重
  • 数据倾斜明显

很多时候任务不是整体都慢,而是:

  • 少数几个 Task 特别慢

先说结论

Spark 性能治理里最值得优先关注的,通常是:

  1. Join 两边数据量和分布是否合理
  2. 有没有明显热点 Key
  3. Shuffle 是否可以减轻
  4. 是否有更合适的 Join 策略

一、为什么数据倾斜特别麻烦

因为一旦某些 Key 特别热,就会导致:

  • 少数分区数据特别多
  • 少数 Task 运行特别久

最终拖慢整批作业。

二、Join 为什么经常是问题中心

因为大多数重型 Spark 作业,最后都绕不开:

  • 多表关联

这时如果:

  • 分布不均
  • 过滤不够早
  • Join 策略不合适

任务成本就会迅速放大。

三、优化更应该先看什么

  • 哪个 Stage 最慢
  • 哪些 Task 明显长尾
  • 是否存在热点 Key
  • 能不能先过滤再 Join

一句话总结

Spark 作业卡慢时,最重要的不是先调很多参数,而是先搞清楚:

  • 慢到底是不是由 Shuffle 和数据倾斜放大的
延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 回看前文会更完整Spark 作业执行与惰性计算适合沿着执行模型、Shuffle、Join 和数据倾斜这条线连续看。Spark 专题 · Spark 执行模型与性能优化同专题其他序列 · Spark 作业执行与性能判断广播变量和累加器什么时候该用适合把依赖类型、Executor 内存、广播变量和 AQE 放在一条 Spark 执行主线上理解。Spark 专题 · Spark 作业执行与性能判断同专题其他序列 · Spark 作业执行与性能判断窄依赖和宽依赖怎么影响执行计划适合把依赖类型、Executor 内存、广播变量和 AQE 放在一条 Spark 执行主线上理解。Spark 专题 · Spark 作业执行与性能判断同专题其他序列 · Spark 资源与状态管理细节资源提交和动态分配怎么调优适合把抽象模型、缓存和资源调度放到一起看。Spark 专题 · Spark 资源与状态管理细节跨专题关联 · 同场景:基础学习缓存穿透治理怎么做更稳适合把 Sentinel、穿透防护、延迟队列和地理位置搜索放在一起看。Redis 专题 · Redis 可用性与热点治理细节跨专题关联 · 同场景:基础学习慢 SQL 治理为什么不能只靠索引适合把大事务、DDL、回填、慢 SQL 治理和归档分层放进一条持续治理主线上看。MySQL 专题 · MySQL 变更治理与数据生命周期
继续阅读Spark 执行模型与性能优化当前序列第 2 篇 / 共 2 篇当前专题第 1 个序列 / 共 3 个序列
往前看
上一篇Spark 作业执行与惰性计算回到当前序列上一章上一序列Hive 表设计与 SQL 调优从第 1 篇开始:Hive 分区、分桶和文件格式怎么选
往后看
下一序列Spark 资源与状态管理细节从第 1 篇开始:RDD、DataFrame、Dataset 怎么选

把零散经验整理成可查、可复用、可持续更新的企业级知识门户