JobConf.setNumMapTasks(n)是有意义的,结合block size会具体影响到map任务的个数,详见FileInputFormat.getSplits源码。假设没有设置mapred.min.split.size,缺省为1的状况下,针对每一个文件会按照min (totalsize[全部文件总大小]/mapnum[jobconf设置的mapnum], blocksize)为大小来拆分,并非说文件小于block size就不去拆分。
2.http://hadoop.hadoopor.com/thread-238-1-1.html
不知道你是要提升整个集群的map/reduce任务数,仍是单个节点可并行运行的map/reduce任务数?对于前者是通常只设置reduce任务数,而map任务数是由Splits个数决定的; 对于后者,是能够在配置中设置的,分别为:mapred.tasktracker.map.tasks.maximum
mapred.tasktracker.reduce.tasks.maximum
另外,还有个参数mapred.jobtracker.taskScheduler.maxRunningTasksPerJob,用来控制一个job最大并行tasks数,这个是指在集群最大并行数。
3.个人理解:具体看FileInputFormat.java的代码
map tasks的个数只要是看splitSize,一个文件根据splitSize分红多少份就有多少个map tasks。而splitSize的计算(看FileInputFormat的源码):splitSize = Math.max(minSize, Math.min(maxSize, blockSize));而
minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));便是某种格式的文件的最小分割size(如看源码sequenceFile是2000)和整个job配置的最小分割size(即mapred-default.xml中mapred.min.split.size的值)之间的较大的那个
maxSize是mapred.max.split.size(mapred-default.xml中居然没有,我试了一下,在mapred-site.xml中配置覆盖也没有用,具体用法参照http://osdir.com/ml/mahout-user.lucene.apache.org/2010-01/msg00231.html用参数配置: hadoop jar /root/mahout-core-0.2.job org.apache.mahout.clustering.lda.LDADriver -Dmapred.max.split.size=900...),若是不配置,默认值是long类型的最大值。(mapred.max.split.size不推荐配置(试))
blockSize是即hdfs-default.xml中dfs.block.size的值,可在hdf-site.xml中覆盖.这个值必须是512的倍数,若是想要数量更多的map的tasks的个数,能够把dfs.block.size设得小一点,512,1024等等,反正上面的公式保证了即便你这个blocksize设得比某种格式的文件的最小分割size要小,最后仍是选者这种格式的最小分割size,若是blocksize比它大,则选用blocksize做为splitSize的大小.
总结:若是想要多一点的map tasks,(1)能够设置dfs.block.size小一点,sequenceFile推荐2048。。。(试)在eclipse运行时,dfs.block.size是由eclipse中mapreduce的设置(dfs.block.size)生效的,而不是hadoop的conf中的配置文件,可是若是用终端hadoop jar命令跑的话,应该是由hadoop的conf中的配置文件决定生效的
(2)推荐: 能够分红多个sequenceFile来做为输入(把上层目录做为输入路径便可,上层目录下包括的必为清一色的sequenceFile),输入路径 "./"或指定上层目录文件名
reduce task的个数:
html
可经过job.setNumReduceTasks(n);设定。多个reduce task的话就会有多个reduce结果,part-r-00000, part-r-00001, ...part-r-0000n java
由Hive来执行相关的查询node
hadoop中默认的mapred.tasktracker.map.tasks.maximum设置是2apache
也即:每个tasktracker同时运行的map任务数为2网络
照此默认设置,查询80天某用户的操做日志,耗时5mins, 45sec负载均衡
通过测试,发现将mapred.tasktracker.map.tasks.maximum设置为节点的cpu cores数目或者数目减1比较合适eclipse
此时的运行效率最高,大概花费3mins, 25secoop
咱们如今的机器都是8核的,因此最终配置以下:测试
mapred.tasktracker.map.tasks.maximum
8
The maximum number of map tasks that will be run
simultaneously by a task tracker.
spa
而对于mapred.map.tasks(每一个job的map任务数)值,hadoop默认值也为2
能够在执行hive前,经过set mapred.map.tasks=24来设定
但因为使用hive,会操做多个input文件,因此hive默认会把map的任务数设置成输入的文件数目
即便你经过set设置了数目,也不起做用…