何时减少任务在Hadoop中启动?


81

在Hadoop中,何时开始减少任务?它们是否在完成一定比例(阈值)的映射器之后开始?如果是,此阈值是否固定?通常使用哪种阈值?

Answers:


205

还原阶段包括3个步骤:随机,排序,还原。随机播放是精简程序从每个映射器收集数据的地方。由于映射器只是数据传输,因此在映射器生成数据时可能会发生这种情况。另一方面,排序和归约只能在所有映射器完成后才能开始。您可以通过查看reducer的完成百分比来确定MapReduce正在执行的操作:0-33%表示其正在洗牌,34-66%是排序,67%-100%是减少。这就是为什么减速器有时会“卡住” 33%的原因-它正在等待映射器完成。

减速器根据已完成的映射器百分比阈值开始改组。您可以更改参数以使减速器迟早启动。

为什么尽早开始使用减速器是件好事?因为随着时间的流逝,它会分散从映射器到化简器的数据传输,如果您的网络是瓶颈,这是一件好事。

为什么提前启动减速器是一件坏事?因为它们“占用”减少了插槽,同时仅复制数据并等待映射器完成。稍后开始的另一个将实际使用reduce插槽的作业现在无法使用它们。

您可以通过更改mapred.reduce.slowstart.completed.mapsin的默认值来自定义化轮启动的时间mapred-site.xml。值1.00将等待所有映射器完成,然后再启动化简器。值0.0将立即启动减速器。0.5当一半的映射器完成时,值为会启动减速器。您也可以mapred.reduce.slowstart.completed.maps逐个工作地进行更改。在新版本的Hadoop(至少2.4.1)中,参数称为mapreduce.job.reduce.slowstart.completedmaps(感谢yegor256用户)。

通常,如果系统一次运行多个作业,我希望保持mapred.reduce.slowstart.completed.maps上述状态0.9。这样,当他们只做复制数据时,他们就不会做任何事情。如果您一次只运行一项作业,那么这样做0.1可能是适当的。


3
您知道我在哪里可以阅读有关您所提及内容的更多信息?
做白日梦的人2012年

1
在我看来,Slowstart的文档非常少。。。。
唐纳德·麦纳

5
好的答案@Donald Miner。只想在较新的Hadoop版本中添加(我使用的是1.1.2),该值默认为0.05。hadoop.apache.org/docs/r1.1.2/mapred-default.html
sufinawaz 2013年

@Donald我正在使用hadoop的0.20.205.0版本,并将mapred-site.xml中的参数“ mapred.reduce.slowstart.completed.maps”设置为0.1,但是reducer仍然在映射器完成后运行。我可以知道为什么吗?
哈利·波特2014年

3
@nishm我认为您在整个reduce阶段相对于reduce阶段内部的reduce感到困惑。减少阶段是混洗,排序和减少。Slowstart告诉它何时开始整个阶段。没错,reduce阶段的reduce仅在映射器完成后才开始。
唐纳德·麦纳

5

reduce阶段可以在调用reducer之前很长时间开始。一旦“ a”映射器完成了该工作,生成的数据就会进行一些排序和改组(包括对组合器和分区器的调用)。减速器“阶段”在启动映射器数据处理后立即开始。完成这些处理后,您将看到减速器百分比的进度。但是,还没有召集任何减速器。根据可用/已使用的处理器数量,数据性质和预期的减速器数量,您可能需要按上述@ Donald-miner所述更改参数。


1

据我所知,Reduce阶段从地图阶段开始,并不断使用地图中的记录。但是,由于在map阶段之后存在sort和shuffle阶段,因此必须对所有输出进行分类并发送到reducer。因此,从逻辑上讲,您可以想象reduce阶段仅在map阶段之后开始,但实际上出于性能原因,reducer也使用映射器初始化。


0

在reduce阶段显示的百分比实际上大约是从映射输出复制到reducers输入目录的数据量。要知道此复制何时开始?您可以按照唐纳德(Donald)所示设置此配置。一旦将所有数据复制到减速器(即100%减少),即减速器开始工作,因此如果减速器代码是I / O或CPU密集型的,则可能冻结为“ 100%减少”。


0

Reduce只在所有映射器都已完成任务之后才开始执行,Reducer必须与所有映射器进行通信,因此它必须等到最后一个映射器完成其任务之后,然而映射器会在完成任务的那一刻开始传输数据。


-1

考虑一个WordCount示例以更好地了解map reduce任务的工作原理。假设我们有一个很大的文件,比如一本小说,我们的任务是查找每个单词在文件中出现的次数。由于文件很大,因此可以将其分为不同的块,并在不同的工作程序节点中复制。字数统计工作由map和reduce任务组成。映射任务将每个块作为输入,并生成一个中间键-值对。在此示例中,由于我们正在计算单词的出现次数,因此在处理一个块时,映射器将产生(word1,count1),(word2,count2)等形式的中间结果。所有映射器的中间结果为通过洗牌阶段将重新排列中间结果。

假设我们从不同映射器输出的地图具有以下形式:

地图1:-(is,24)(was,32)(and,12)

Map2:-(我的12)(是23)(过去30)

映射输出的排序方式是将相同的键值分配给相同的reducer。在这里,这意味着对应于is,was等的键使用相同的reducer。正是reducer产生最终输出,在这种情况下将是:-(and,12)(is,47)(my,12 )(原为62)


没有解决OP的减速器何时启动的问题。
西基里提·巴丹

-1

Reducer任务仅在completion所有映射器之后启动。

但是数据传输发生在eachMap之后。实际上,这是一个拉操作。

这意味着每次reducer都会询问每个maptask是否有一些要从Map检索的数据,如果发现任何mapper完成了任务,Reducer会提取中间数据。

来自Mapper的中间数据存储在中disk。从Mapper到Reduce的数据传输Data Locality是通过网络进行的(在Reduce阶段未保留)


-2

当Mapper完成其任务时,Reducer将开始其作业以减少数据,这就是Mapreduce作业。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.