主要观点:传统观点认为在减少分区时应使用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 很重要,理论上有效的在生产环境中不一定有效。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。