当合并比重新分区慢时:一个 Spark 性能悖论

主要观点:传统观点认为在减少分区时应使用coalesce()而非repartition(),因其避免洗牌更快速,但实际情况并非总是如此。在近期生产工作负载中,使用repartition()写数据到更少分区时性能提升了 33%。
关键信息:

  • coalesce(n)可减少分区且避免全洗牌,适用于过滤操作后减少分区,是窄转换。
  • repartition(n)会进行全洗牌重新分配数据,是宽转换,可增加或减少分区数。
  • 在特定场景中,使用repartition(40)写数据到 40 个文件比coalesce(40)快 30%,原因是 Catalyst 优化器的下推导致coalesce()执行过早,限制了并行度,而repartition()虽增加了洗牌阶段,但早期阶段的并行度提升弥补了这一开销。
    重要细节:
  • 给出简化的代码示例展示coalesce()repartition()的使用及效果对比。
  • 提出使用决策框架,何时使用coalesce()何时使用repartition()
  • 强调关键要点,如 Catalyst 优化不一定最优、并行度比避免洗牌更重要、查看执行计划等。
  • 结论是要对 Spark 作业进行分析,Spark UI 很重要,理论上有效的在生产环境中不一定有效。
阅读 21
0 条评论