Spark Shuffle 和 Hadoop MapReduce Shuffle 是分布式计算框架中处理中间结果的关键阶段,它们的主要区别在于设计原理、执行效率和资源利用率:
Hadoop MapReduce Shuffle
-
Sort-based:Hadoop MapReduce 的 Shuffle 过程基于排序。在 Map 阶段结束后,每个 Mapper 会将不同 key 对应的 value 按照 key 进行排序,并且通常会对数据进行分区(partitioning),然后写入本地磁盘。Reducer 在拉取数据前,Mapper 已经完成了排序和分区工作。
-
Disk-intensive:由于 Map 阶段产生的中间数据会被写入磁盘,并且在 Reduce 阶段开始之前,这些数据需要从各个 Mapper 节点上读取到 Reducer 节点,这涉及到大量的磁盘 I/O 操作。
-
Secondary Sort:MapReduce 支持 secondary sort,可以对 value 进行二次排序,适合于需要全局排序的应用场景。
-
Pipeline Breaker:Shuffle 阶段是 Map 和 Reduce 之间的瓶颈,因为它会导致流水线操作的中断,即 Map 阶段完成后必须等待 Shuffle 完成才能启动 Reduce 阶段。
Spark Shuffle
-
Hash-based:Spark Shuffle 默认使用哈希方式进行分区,而不是基于排序,但也可以选择启用排序 shuffle。它根据 partitioner 的逻辑把数据分发到不同的 reduce task 中,而不是预先在每个 mapper 上排序所有