Reducer多少个最佳

来源:互联网 发布:华为系统优化 编辑:程序博客网 时间:2024/04/27 21:23

MapReduce框架的执行流程,我们知道,输入文件会被分成多个splits,每个split对应一个Mapper,所以Mapper的数量由splits的数目决定。

Reducer的数目可以通过job.setNumReduceTasks()函数来设置,默认情况下只有一个,有些时候,Reducer只有一个并不是性能最高,因此我们究竟设置多少个Reducer合适呢?

hadoop中,有个叫做slots的概念,Mapper或者Reducer执行时都得获得一个splot才能继续,否则只能等待。Slot可以理解为TaskTracker能并发执行多少个任务。

Slot分为mapper slot Reducer slot,分别对应最大可执行的mapper数和reducer数。用户可以通过修改mapred-site.xml文件的mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum来设置slot的值,默认为2.

集群中reducer slot的总数==总结点数*每个节点的reducer slot数目,每个节点的reducer slot数目由mapred.tasktracker.reduce.tasks.maximum来确定。

Reducer的最佳的数目值与总的reducer slot数目有关,reducer的最佳数目值应该略小于reducer slot的总数。这样做的目的:首先让所有的reducer可以并行执行,其次对于未分配的slot,可以在reducer发生故障时,立即分配给新创建的Reducer.

当然,在设置Reducer数目的时候还得考虑Mapper的数目。按照MapReduce的思想,应该Mapper的数目>=Reducer的数目。

假设Mapper的数目<Reducer的数目,那么按照MapReduce的流程,就会有Reducer剩余,剩余的Reducer根本收不到来自Mapper的输入,白白浪费资源。

因此,不管如何,Reducers<Mappers是必不可少的前提。

当然,MapReduce的值也不是随意设定的,他和机器的内存以及处理器核数等等都有关系,真是的集群环境需要考虑的还有很多。

 

 

 

 

0 0