MapReduce 程序 运行 中的洗牌步骤是否与映射并行?

Does the shuffle step in a MapReduce program run in parallel with Mapping?

我试图理解 MapReduce 程序。这样做时,我注意到在所有映射任务完成后,reduce 任务几乎立即开始执行。现在,这是令人惊讶的,因为那里的 reduce 任务处理按键分组的数据,这意味着中间有 shuffle/sort 个步骤。唯一可能发生这种情况的方法是改组与映射并行进行。

其次,如果洗牌确实与映射并行进行,那么在 Apache Spark 中相当于什么?映射和按键分组 and/or 排序也可以并行发生吗?

Hadoop 的 MapReduce 不仅仅是 map 和 reduce 阶段,还有其他步骤,例如组合器(map-side reduce)和合并,如下图所示(摘自 http://www.bodhtree.com/blog/2012/10/18/ever-wondered-what-happens-between-map-and-reduce/ 虽然映射仍在 运行ning 并且当它们发出键时,这些键可以被路由和合并,并且到映射完成时,一些 reduce 桶所需的所有信息可能已经被处理并准备好进行 reduce。

Spark 构建处理所需阶段的 DAG(有向无环图),并将它们分组到需要在节点之间洗牌数据的阶段。与在 map 期间推送数据的 Hadoop 不同,spark reducer 拉取数据,因此仅在它们开始 运行 时才这样做(另一方面,Spark 尝试在内存中 运行 更多(相对于磁盘)并且使用 DAG,可以更好地处理迭代处理)

A​​lexey Grishchenko 对 Spark Shuffle 有很好的解释here(请注意,从 Spark 2 开始,只存在排序随机播放)