我试着理解一个mapreduce程序。在执行此操作时,我注意到reduce任务几乎在完成所有Map任务后立即开始执行。现在,这是令人惊讶的,因为reduce任务处理的是按键分组的数据,这意味着在这两个任务之间有一个shuffle/sort步骤。唯一可能发生这种情况的方法是,洗牌与Map并行进行。其次,如果洗牌确实是与Map并行进行的,那么在apachespark中,洗牌的等效性是什么?通过键和/或排序进行Map和分组是否也可以并行进行?
bq3bfh9z1#
hadoop的mapreduce不仅仅是map和reduce阶段,还有一些附加的步骤,比如combiners(map side reduce)和merge,如下所示(摘自http://www.bodhtree.com/blog/2012/10/18/ever-wondered-what-happens-between-map-and-reduce/)当Map仍在运行并且当它们发出密钥时,这些密钥可以被路由和合并,并且当Map完成时,一些reduce bucket所需的所有信息可能已经被处理并准备好reduce。spark构建了一个dag(directacyclicgraph,直接非循环图)来表示处理所需的阶段,并将它们分组为需要在节点之间洗牌数据的阶段。与hadoop不同的是,spark reducer在map期间推送数据,因此只在开始运行时才这样做(另一方面,spark尝试在内存中运行更多的数据(与磁盘相比)并使用dag,可以更好地处理迭代处理)alexey grishchenko在这里对spark shuffle有一个很好的解释(注意到spark 2只存在排序shuffle)
1条答案
按热度按时间bq3bfh9z1#
hadoop的mapreduce不仅仅是map和reduce阶段,还有一些附加的步骤,比如combiners(map side reduce)和merge,如下所示(摘自http://www.bodhtree.com/blog/2012/10/18/ever-wondered-what-happens-between-map-and-reduce/)
当Map仍在运行并且当它们发出密钥时,这些密钥可以被路由和合并,并且当Map完成时,一些reduce bucket所需的所有信息可能已经被处理并准备好reduce。
spark构建了一个dag(directacyclicgraph,直接非循环图)来表示处理所需的阶段,并将它们分组为需要在节点之间洗牌数据的阶段。与hadoop不同的是,spark reducer在map期间推送数据,因此只在开始运行时才这样做(另一方面,spark尝试在内存中运行更多的数据(与磁盘相比)并使用dag,可以更好地处理迭代处理)
alexey grishchenko在这里对spark shuffle有一个很好的解释(注意到spark 2只存在排序shuffle)