Spark Shuffle(洗牌)操作之所以开销巨大,是因为它打破了 Spark “内存计算”和“流水线执行”的优势,强制触发了大量的磁盘 I/O、网络 I/O、CPU 序列化/反序列化以及内存消耗。 简单来说,Shuffle 是将数据从一个节点(Map 端)重新分发到其他节点(Reduce 端)的过程(例如 , , 等操作)。 以下是 Shuffle 开销大的具体原因分析: 1. 磁盘 I/O 开销 (Disk I/O) —— 最主要的瓶颈 虽然 Spark 是内存计算引擎,但 Shuffle 阶段为了保证容错(Fault Tolerance)和应对内存不足,必须将中间结果写入磁盘。 Map 端写磁盘: 每个 Map 任务在计算结束后,不能直接把数据发给 Reduce 端(因为 Reduce 端可能还没启动,或者内存放不下),必须先将数据分类、排序并写入本地磁盘(Spill to Disk)。 Reduce 端读磁盘: Reduce 任务启动后,需要跨节点去拉取(Fetch)属于自己的那部分数据。这涉及到大量的随机读取(Random Read),机械硬盘在随机读写时的性能非常差...