原文连接:http://blog.csdn.net/aaa1117a8w5s6d/article/details/33781319node
对一 个job的map数和reduce数的设定对一个job的运行是很是重要的,而且很是简单。如下是一些设 置这几个值的经验总结:网络
hadoop distcp -Ddfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks的方式来将已经存在咋hdfs上的数据进行大块化。而后删除掉原先的文件。
------------------------------------------------------------------------------------------------------------------并发
MapReduce框架将文件分为多个splits,并为每一个splits建立一个Mapper,因此Mappers的个数直接由splits的数目决定。而Reducers的数目能够经过job.setNumReduceTasks()函数设置,默认状况只有一个Reducer。在真正的集群环境下,若是默认,那么全部的中间数据会发送给惟一的Reducer,致使任务变得很是缓慢。究竟设多少个Reducers合适呢?为了解决这个问题,首先来了解一下slots的概念。app
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会工做消耗资源开销,可是对任务没有任何帮助。tcp