什么时候减less任务从Hadoop开始?

在Hadoop什么时候减less任务开始? 他们是否在一定百分比(阈值)的制图完成后开始? 如果是的话,这个门槛是固定的? 通常使用什么样的阈值?

缩小阶段有3个步骤:混洗,分类,缩小。 洗牌是从每个映射器的减速器收集数据的地方。 这可能在映射器生成数据时发生,因为它只是一个数据传输。 另一方面,分类和缩减只能在所有的mapper完成后才能启动。 您可以通过查看Reducer完成百分比来确定MapReduce正在执行哪一个操作:0-33%表示正在洗牌,34-66%为sorting,67%-100%为减less。 这就是为什么你的减速器有时会“卡住”在33% – 它正在等待映射器完成。

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

为什么要早日启动减速机是一件好事? 因为它随着时间的推移将数据从映射器传输到还原器,如果您的networking是瓶颈,这是一件好事。

为什么早期启动减速机是一件坏事? 因为他们“拼凑起来”减less了插槽,而只复制数据并等待映射器完成。 另外一个稍后开始实际使用减less插槽的作业现在不能使用它们。

您可以通过更改mapred-site.xmlmapred.reduce.slowstart.completed.maps的默认值来自定义reducers启动时间。 值1.00将等待所有映射器在启动减速器之前完成。 值为0.0将立即启动减速器。 一半的映射器完成后, 0.5值将启动减速器。 您也可以mapred.reduce.slowstart.completed.maps更改mapred.reduce.slowstart.completed.maps在新版本的Hadoop(至less2.4.1)中调用的参数是mapreduce.job.reduce.slowstart.completedmaps (感谢用户yegor256)。

通常情况下,如果系统一次运行多个作业,我喜欢将mapred.reduce.slowstart.completed.maps保持在0.9以上。 这样,当他们没有做任何事情,而是复制数据的时候,这个工作并没有使减速器停滞不前。 如果你一次只有一份工作,那么做0.1就可能是合适的。

缩减阶段可以在减速器被调用之前很长时间开始。 一旦“a”映射器完成作业,生成的数据就会经过一些sorting和混洗(包括对组合器和分区器的调用)。 减速器“阶段”在映射器数据处理开始后立即开始。 随着这些处理完成,你会看到减less百分比的进展。 然而,还没有一个减速器被调用。 根据可用/可用处理器的数量,数据的性质和预期减速器的数量,您可能需要按上述@ Donald-miner所述更改参数。

尽我所知减less阶段从地图阶段开始,并继续消耗地图的logging。 然而,由于在映射阶段之后有sorting和洗牌阶段,所有的输出必须被分类并发送到减速器。 因此,逻辑上可以想象,缩小阶段仅在映射阶段之后才开始,但实际上由于性能原因,缩放器也是用映射器初始化的。

当Mapper完成任务时,Reducer开始工作以减less数据,这是Mapreduce工作。

缩小阶段显示的百分比实际上是从映射输出复制到减速器input目录的数据量。 要知道这个复制什么时候开始? 这是一个可以设置为Donald在上面显示的configuration。 一旦所有的数据被复制到reducer(即100%减less),那么当reducer开始工作,因此如果你的reducer代码是I / O或CPU密集型的,可能会冻结在“100%减less”。

考虑一个WordCount示例,以便更好地理解地图缩减任务如何工作。假设我们有一个大文件,说一个小说,我们的任务是找出文件中每个单词出现的次数。 由于该文件很大,因此可能会将其分成不同的块并在不同的工作节点中复制。 字数工作由地图和减less任务组成。 map任务将每个块作为input,并生成一个中间键值对。 在这个例子中,由于我们正在计算单词的出现次数,因此映射器在处理一个块时将产生forms(word1,count1),(word2,count2)等的中间结果。所有映射器的中间结果是通过一个混洗阶段,这将重新sorting中间结果。

假设我们从不同的映射器输出的映射的格式如下:

地图1: – (是,24)(是,32)(和12)

地图2: – (我的,12)(是,23)(是,30)

映射输出按照相同的键值赋予相同的缩减器的方式进行sorting。 在这里,这意味着对应的键是,等是相同的reducer.It是减速器产生最终的输出,在这种情况下,将是:(和,12)(是,47)(我的,12 )(状态62)

Reducer任务只有在completion所有映射器之后才会启动。

但数据传输发生在each Map之后。 其实这是一个拉动操作。

也就是说,Reducer每次都会询问每个maptask是否有一些数据要从Map中取回。如果他们发现任何一个mapper完成了他们的任务,Reducer就会拉取中间数据。

Mapper的中间数据存储在disk 。 并且从Mapper到Reduce的数据传输通过networking发生( Data Locality Reduce在Reduce阶段不保留)

Reduce只有在所有映射器都捕获完毕后才启动,Reducer必须与所有映射器进行通信,因此必须等到最后一个映射器完成任务后,映射器才开始将数据传输到完成任务的那一刻。