mapreduce中reducers个数设置

来源:互联网 发布:mac卸载java 8 编辑:程序博客网 时间:2024/05/22 00:26

       MapReduce框架将文件分为多个splits,并为每个splits创建一个Mapper,所以Mappers的个数直接由splits的数目决定。而Reducers的数目可以通过job.setNumReduceTasks()函数设置,默认情况只有一个Reducer。在真正的集群环境下,如果默认,那么所有的中间数据会发送给唯一的Reducer,导致任务变得非常缓慢。究竟设多少个Reducers合适呢?为了解决这个问题,首先来了解一下slots的概念。

       slots有点类似一个资源池,每个任务(map和reduce)执行时都必须获得一个slot才能继续,否则只能等待。当一个任务完成后,该任务就归还slot,这个过程有点类似释放资源到资源池中。显然,每一个获得资源的任务都可以立即执行,无需等待。另一方面,mapreduce的任务由tasktracker节点负责执行的,所以slots可进一步理解为tasktrackers能够并发执行多个任务。slots分为mapper slots和reducer slots,分别对应最大可并行执行的mapper和reducer数。用户可以通过修改mapred-site.xml配置文件的mapred.tasktracker.map.tasks.maxmum来设置slots的值,默认为2.

       集群中可用rducer slots 的总数等于集群中的总结点数诚意每个节点有多少个slots。reducers 数目的最佳值和reducer slots的总数有关,通常情况下,让reducers的数目略小于reducer slots的总数,这样的目的:首先reducers可以并行执行,减少排队时间;其次对于未执行reducer的slots可以在其他reducer发生故障时,立即分配给新创建的reducer,不会明显 加长任务总时间。

       如果出现reducers》mappers的情况就不合理了,这样有些mappers会工作消耗资源开销,但是对任务没有任何帮助。

0 0
原创粉丝点击