在Hadoop中,何时开始减少任务?它们是否在完成一定比例(阈值)的映射器之后开始?如果是,此阈值是否固定?通常使用哪种阈值?
Answers:
还原阶段包括3个步骤:随机,排序,还原。随机播放是精简程序从每个映射器收集数据的地方。由于映射器只是数据传输,因此在映射器生成数据时可能会发生这种情况。另一方面,排序和归约只能在所有映射器完成后才能开始。您可以通过查看reducer的完成百分比来确定MapReduce正在执行的操作:0-33%表示其正在洗牌,34-66%是排序,67%-100%是减少。这就是为什么减速器有时会“卡住” 33%的原因-它正在等待映射器完成。
减速器根据已完成的映射器百分比阈值开始改组。您可以更改参数以使减速器迟早启动。
为什么尽早开始使用减速器是件好事?因为随着时间的流逝,它会分散从映射器到化简器的数据传输,如果您的网络是瓶颈,这是一件好事。
为什么提前启动减速器是一件坏事?因为它们“占用”减少了插槽,同时仅复制数据并等待映射器完成。稍后开始的另一个将实际使用reduce插槽的作业现在无法使用它们。
您可以通过更改mapred.reduce.slowstart.completed.maps
in的默认值来自定义化轮启动的时间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
可能是适当的。
据我所知,Reduce阶段从地图阶段开始,并不断使用地图中的记录。但是,由于在map阶段之后存在sort和shuffle阶段,因此必须对所有输出进行分类并发送到reducer。因此,从逻辑上讲,您可以想象reduce阶段仅在map阶段之后开始,但实际上出于性能原因,reducer也使用映射器初始化。
考虑一个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)
Reducer任务仅在completion
所有映射器之后启动。
但是数据传输发生在each
Map之后。实际上,这是一个拉操作。
这意味着每次reducer都会询问每个maptask是否有一些要从Map检索的数据,如果发现任何mapper完成了任务,Reducer会提取中间数据。
来自Mapper的中间数据存储在中disk
。从Mapper到Reduce的数据传输Data Locality
是通过网络进行的(在Reduce阶段未保留)