在 Hadoop 中,reduce 任务什么时候开始?

在 Hadoop 中,reduce 任务什么时候开始?它们是否在映射器完成一定百分比(阈值)后开始?如果是这样,这个门槛是固定的吗?通常使用什么样的阈值?

38500 次浏览

据我所知,Reduce 阶段从 map 阶段开始,并不断消耗 map 中的记录。然而,因为有排序和洗牌阶段后,地图阶段的所有输出必须进行排序,并发送到减速器。所以逻辑上,您可以想象 reduce 阶段只在 map 阶段之后才开始,但实际上出于性能原因,reduce 也是用 mapper 初始化的。

减少阶段有三个步骤: 洗牌,排序,减少。Shuffle 是由约简器从每个映射器收集数据的地方。这可能发生在映射程序生成数据时,因为它只是一个数据传输。另一方面,sort 和 reduce 只能在完成所有映射程序之后才能启动。您可以通过查看 reduce 完成百分比来判断 MapReduce 正在做哪一个: 0-33% 意味着它正在做 shuffle,34-66% 是 sort,67% -100% 是 reduce。这就是为什么你的递减器有时看起来“卡住”在33% ——它正在等待地图绘制者完成。

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

为什么提前启动减速器是件好事?因为随着时间的推移,它会将数据从映射器传输到简化器,如果您的网络是瓶颈,那么这是一件好事。

为什么提前启动减速器是件坏事?因为它们“霸占”减少槽,而只复制数据并等待映射器完成。另一个稍后才开始使用 reduce 插槽的作业现在不能使用它们。

通过更改 mapred-site.xmlmapred.reduce.slowstart.completed.maps的默认值,可以自定义减速器启动时间。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 输出复制到 reduce 输入目录的数据量。 想知道复印什么时候开始?这是一个可以设置的配置,如上面 Donald 所示。一旦所有的数据被复制到 reducers (即。100% reduce) ,这是当还原器开始工作时,因此如果您的还原器代码是 I/O 或 CPU 密集型的,那么可能会冻结在“100% reduce”中。

还原阶段可以在调用还原器之前很长时间开始。一旦“ a”映射器完成了这项工作,生成的数据就会经历一些排序和洗牌(包括对组合器和分区器的调用)。减速器“阶段”启动时刻后映射器数据处理开始。随着这些处理的完成,您将看到降低百分比的进展。然而,目前还没有任何一家减排机构被召集进来。根据可用/使用的处理器的数量、数据的性质和预期的减速器的数量,您可能需要更改上面@Donald-miner 所描述的参数。

考虑一个 WordCount 示例,以便更好地理解 map reduce 任务是如何工作的。假设我们有一个很大的文件,比如一本小说,我们的任务是找出文件中每个单词出现的次数。由于文件很大,因此可以将其划分为不同的块,并在不同的工作节点中复制。字数统计作业由 map 和 reduce 任务组成。Map 任务接受每个块作为输入,并生成一个中间键-值对。在这个例子中,由于我们计算单词的出现次数,映射器在处理一个块时将导致表单(word1,count 1) ,(word2,count 2)等的中间结果。所有映射器的中间结果通过洗牌阶段传递,洗牌阶段将对中间结果重新排序。

假设不同映射程序的映射输出如下:

地图1: - (即24) (曾经,32岁) (及12)

地图2: - (我的,12) (即23) (曾经,30岁)

对映射输出进行排序的方式是,将相同的键值给予相同的减速器。在这里,它意味着对应的键是,was 等等去相同的减速器。是减速器产生最终的输出,在这种情况下是:- (和,12)(是,47)(我的,12)(是,62)

只有在所有映射器的 completion之后,才会开始减速器任务。

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

这意味着,每次 reduce 都会询问每个 map 任务是否有要从 Map 检索的数据。如果他们发现任何 mapper 完成了他们的任务,Reduce 就会拉出中间数据。

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

Reduce 只有在所有 mapper 完成任务之后才会开始,因为它必须与所有 mapper 通信,所以它必须等到最后一个 mapper 完成任务。然而 mapper 在完成任务之后才会开始传输数据。

当 Mapper 完成它的任务,然后减少器开始它的工作减少数据,这是 Mapreduce 工作。