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

在 Apache Spark 中,Shuffle 的读取阶段有哪些优化策略来降低网络 I/O 开销与延迟?

数据性能优化技术原理Apache Spark

考察说明

考察对 Spark Shuffle 读取阶段内部机制的理解,以及实际调优能力。

回答思路

  1. 【回答框架 1】Shuffle 读取阶段主要涉及从上游 map 任务获取中间数据。Spark 通过索引文件(index file)和数据文件(data file)管理数据块,读取时利用索引定位数据,减少随机磁盘 I/O。
  2. 【回答框架 2】减少网络 IO 的关键是本地性感知调度:优先从本地节点读取数据,避免跨节点传输。Spark 通过 block 的 location 信息,让 reducer 尽可能调度到与数据所在 executor 相同的节点上。
  3. 【回答框架 3】读取端还引入了合并(fetch)和并发控制机制。通过 maxFetchFailures、reducer maxMBInFlight 等参数控制并发请求数和带宽,避免网络拥塞。
  4. 【回答框架 4】Spark 2.x 后的 Shuffle 优化包括:使用 Tungsten 优化序列化,减少数据体积;支持自定义 shuffle 管理器(如 SortShuffleManager),减少小文件数量。
  5. 【回答框架 5】进一步可通过调整 spark.shuffle.compress 启用压缩,以及使用 External Shuffle Service 来复用 shuffle 数据,减少重复计算和网络传输。
  6. 【关键点 1】本地性调度优先在本地读取,减少跨节点网络 IO。
  7. 【关键点 2】索引文件定位数据块,减少随机磁盘读取。
  8. 【关键点 3】控制并发 fetch 数量(如 spark.reducer.maxSizeInFlight)以平衡吞吐和延迟。
  9. 【关键点 4】支持 shuffle 压缩和合并,可显著减少网络传输的数据量。
  10. 【关键点 5】External Shuffle Service 可在 executor 失败时保留 shuffle 数据,避免重算。
  11. 【易错点 1】不能简单认为加大并发数一定能降低延迟,过高的并发可能引发网络拥塞。
  12. 【易错点 2】Shuffle 压缩可能增加 CPU 开销,在某些场景下可能使得收益降低。
  13. 【易错点 3】过度依赖本地性可能导致数据倾斜,实际中需要结合数据分布和集群拓扑综合调优。