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設置了數目,也不起做用…