我试图了解MapReduce程序。在这样做时,我注意到在完成所有地图任务后,reduce任务几乎立即开始执行。现在,这是令人惊讶的,因为那里的reduce任务使用按键分组的数据,这意味着在它们之间进行了shuffle / sort步骤。这种情况发生的唯一方法就是如果洗牌与映射并行完成。
其次,如果洗牌确实是与映射并行完成的,那么Apache Spark中的等价物是什么?可以通过键和/或排序进行映射和分组并行吗?
答案 0 :(得分:5)
Hadoop的MapReduce不只是map和reduce阶段还有其他步骤,如合并器(map-side reduce)和merge,如下图所示(取自http://www.bodhtree.com/blog/2012/10/18/ever-wondered-what-happens-between-map-and-reduce/) 虽然地图仍然在运行,并且当它们发出密钥时,这些密钥可以被路由和合并,并且在时间映射完成后,某些减少桶所需的所有信息可能已经被处理并准备好进行减少。
Spark构建了处理所需阶段的DAG(直接非循环图),并将它们分组到需要在节点之间进行混洗的阶段。与在地图期间推送数据的Hadoop不同,火花减少器会拉动数据,因此只有在它们开始运行时才会执行此操作(另一方面,Spark尝试在内存中运行更多(与磁盘相比)并使用DAG处理迭代处理更好)
Alexey Grishchenko对Spark Shuffle here有一个很好的解释(请注意,从Spark 2开始只存在排序洗牌)