在Hadoop中什么时候开始减少任务?它们是在完成一定百分比(阈值)的映射器后开始的吗?如果是这样,这个门槛是否固定?通常使用什么样的阈值?
答案 0 :(得分:198)
减少阶段有3个步骤:随机,排序,减少。 Shuffle是每个映射器的reducer收集数据的地方。当映射器生成数据时会发生这种情况,因为它只是数据传输。另一方面,只有在完成所有映射器后才能启动sort和reduce。你可以通过查看减速器完成百分比来判断MapReduce正在做什么:0-33%意味着它正在进行洗牌,34-66%是排序,67%-100%是减少。这就是为什么你的减速器有时看起来“卡住”33% - 它正在等待地图制作者完成。
Reducers根据已完成的映射器百分比阈值开始洗牌。您可以更改参数以使减速器迟早启动。
为什么早期启动减速机是一件好事?因为它会随着时间的推移将数据传输从映射器传播到Reducer,如果您的网络是瓶颈,这是一件好事。
为什么早期开始减速机是一件坏事?因为他们“hog up”减少了插槽,同时只复制数据并等待映射器完成。另一个稍后开始实际使用reduce槽的工作现在无法使用它们。
您可以通过更改mapred.reduce.slowstart.completed.maps
中mapred-site.xml
的默认值来自定义Reducer启动的时间。值1.00
将等待所有映射器在启动Reducer之前完成。值0.0
将立即启动减速器。当一半映射器完成时,值0.5
将启动reducer。您还可以逐个更改mapred.reduce.slowstart.completed.maps
。 在新版本的Hadoop(至少2.4.1)中,该参数被称为mapreduce.job.reduce.slowstart.completedmaps
(感谢用户yegor256)。
通常情况下,如果系统一次运行多个作业,我希望将mapred.reduce.slowstart.completed.maps
保持在0.9
之上。这样,当工作除了复制数据之外什么都不做时,工作不会占用减速器。如果您一次只运行一个作业,那么0.1
可能是合适的。
答案 1 :(得分:4)
reduce函数可以在调用reducer之前很久就开始。一旦“a”映射器完成作业,生成的数据就会经历一些排序和重排(包括调用组合器和分区器)。减速器“阶段”在映射器数据处理开始后的那一刻起作用。完成这些处理后,您将看到减速器百分比的进度。但是,尚未调用任何减速器。根据可用/使用的处理器数量,数据的性质和预期的减速器数量,您可能需要更改上面@ Donald-miner所描述的参数。
答案 2 :(得分:1)
我同样了解Reduce阶段从地图阶段开始并继续使用地图中的记录。但是,由于在映射阶段之后存在排序和混洗阶段,因此必须对所有输出进行排序并将其发送到reducer。因此,逻辑上你可以想象减少阶段仅在映射阶段之后开始,但实际上对于性能原因还原器也是用映射器初始化的。
答案 3 :(得分:0)
reduce阶段显示的百分比实际上是从map输出复制到reducers输入目录的数据量。 要知道这个复制何时开始?这是您可以设置为唐纳德上面显示的配置。一旦所有数据被复制到Reducer(即100%减少),那就是当reducer开始工作时,如果你的Reducer代码是I / O或CPU密集型,那么可能会冻结“100%reduce”。
答案 4 :(得分:0)
只有在所有映射器都完成任务后才开始减少任务,Reducer必须与所有映射器通信,因此它必须等到最后一个映射器完成其任务。然后映射器开始将数据传输到它完成任务的那一刻。
答案 5 :(得分:-1)
考虑一个WordCount示例,以便更好地理解地图缩减任务的工作原理。假设我们有一个大文件,比如小说,我们的任务是找到每个单词在文件中出现的次数。由于文件很大,因此可能会将其划分为不同的块并在不同的工作节点中进行复制。单词计数作业由map和reduce任务组成。 map任务将每个块作为输入,并生成一个中间键值对。在这个例子中,由于我们正在计算单词的出现次数,因此映射器在处理块时会产生表单(word1,count1),(word2,count2)等的中间结果。所有映射器的中间结果是通过一个洗牌阶段,将重新排序中间结果。
假设我们来自不同映射器的地图输出具有以下形式:
地图1: - (是,24) (状态32) (和,12)
Map2: - (我12) (是,23) (状态,30)
对地图输出进行排序,使得相同的键值被赋予相同的缩减器。这里意味着对应的是,等等的键是相同的reducer。它是产生最终输出的reducer,在这种情况下将是: - (并且,12)(是,47)(我的,12)(状态62)
答案 6 :(得分:-1)
Reducer任务仅在所有映射器的completion
之后开始。
但是数据传输发生在each
Map之后。
实际上它是拉动操作。
这意味着,每次reducer会询问每个maptask是否有一些数据要从Map中重新获取。如果他们发现任何mapper完成了他们的任务,Reducer会拉出中间数据。
来自Mapper的中间数据存储在disk
中。
从Mapper到Reduce的数据传输通过网络进行(Data Locality
未在Reduce阶段保留)
答案 7 :(得分:-1)
当Mapper完成任务后,Reducer开始工作以减少数据,这是Mapreduce工作。