我有关于什么时候洗牌的问题。
假设我有2个映射器和1个减速器。每个映射器将生成输出map1和map2。此map1和map2存储在相应datanode的临时磁盘中。
现在reducer应该等待map1和map2的输出?换句话说什么时候洗牌开始了?一旦map1完成或者它还必须等待map2完成?
我正在收听减速机上的流量,我无法找到任何流量,但控制台输出显示已经完成减少70%(大约)。
14/12/18 17:45:55 INFO mapred.JobClient: map 97% reduce 22%
14/12/18 17:45:58 INFO mapred.JobClient: map 98% reduce 22%
14/12/18 17:45:59 INFO mapred.JobClient: map 99% reduce 22%
14/12/18 17:46:07 INFO mapred.JobClient: map 100% reduce 22%
14/12/18 17:46:12 INFO mapred.JobClient: map 100% reduce 67%
14/12/18 17:46:15 INFO mapred.JobClient: map 100% reduce 71%
我看到在这一点之后出现了混乱的交通流量。
我在这里感到困惑。这约70%的减速机工作是什么? !
由于
答案 0 :(得分:1)
在你的减速机中...首先33%是复制阶段,然后接下来33%是洗牌和排序阶段,然后最终33%是你的实际减少操作。
我将尝试解释一个简单的流程: 完成映射任务后,将复制映射任务的输出,以确定要执行reduce任务。 Map和Reduce发生在同一台机器上不会发生.. 当一些映射器完成时,即使在完整的映射阶段发生之前,你会注意到减少阶段的一些增量。它是由正在复制的那些已完成的映射任务输出的数据。现在可以复制已完成的地图任务,其中必须发生减少任务。仅在完整地图阶段结束后才开始改组。这是因为,输出键将被排序..并且您不能排序直到有完整的键空间..右.. ??
答案 1 :(得分:1)
实际上,在地图和缩小边都会发生排序。 Definitive guide
清楚地解释了这一点答案 2 :(得分:0)
Shuffle和Sort阶段一起称为“复制”阶段。排序在RAM中完成。如果由于内存不足而需要外部排序,则会发生合并排序。所以我们写sort / merge。
实际上,每个Map任务都有3个阶段:Map,Partitioning,Sort / Merge。每个Reduce任务都有3个阶段:Shuffle,Sort / Merge,Reduce。
在Hadoop中,当生成5%的所有地图任务输出时,随机阶段开始。在此策略中,尽管洗牌阶段较早开始以缓解作业执行时间,但它会导致重复合并以及更多磁盘访问,从而导致延长作业执行时间。