数据岗位面试题更新 2026-08-05

请阐述 PySpark 中的 Shuffle 操作过程,并给出优化其性能的若干策略。

数据性能优化技术原理方案权衡PySpark

考察说明

考察对 PySpark Shuffle 机制的理解以及性能调优的实际经验。

回答思路

  1. 【回答框架 1】Shuffle 是 PySpark 中在分区之间重新分配数据的机制,常见于 groupBy、join、reduceByKey 等宽依赖算子。它涉及 Map 端写数据到本地磁盘,然后通过网络传输到 Reduce 端拉取,并可能触发排序和聚合,开销较大。
  2. 【回答框架 2】优化 Shuffle 的性能可从减少数据量和降低开销入手。使用 map-side 预聚合,如 reduceByKey 替代 groupByKey,可以显著减少网络传输的数据量。合理设置分区数,避免过多分区导致大量小文件,或过少分区导致数据倾斜和资源利用不足。
  3. 【回答框架 3】采用广播变量优化,当 join 中一张表较小时,可将其广播到各 executor,避免 Shuffle。此外,开启 Shuffle 服务、调整缓冲区大小、使用压缩和序列化机制也能提升性能。
  4. 【回答框架 4】注意数据倾斜问题,可通过加盐、两阶段聚合或重新分区来缓解。同时,监控和调优 Spark 配置,如 spark.sql.shuffle.partitions 和 spark.default.parallelism,但需结合具体场景和资源限制。
  5. 【关键点 1】Shuffle 源于宽依赖,涉及磁盘写和网络传输。
  6. 【关键点 2】reduceByKey 优于 groupByKey,因有 map 端预聚合。
  7. 【关键点 3】广播变量可避免大表与小表 join 的 Shuffle。
  8. 【关键点 4】分区数和序列化方式影响 Shuffle 性能。
  9. 【关键点 5】数据倾斜需特殊处理,如加盐或重新分区。
  10. 【易错点 1】不恰当的分区数可能导致数据倾斜或大量小文件。
  11. 【易错点 2】盲目增加并行度未必提升性能,可能增加 Shuffle 开销。
  12. 【易错点 3】忽略网络和磁盘 I/O 瓶颈,而只关注 CPU 调优。