MapReduce Map數 reduce數設置

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

 

 

 

  • 增長task的數量,一方面增長了系統的開銷,另外一方面增長了負載平衡和減少了任務失敗的代價;
  • map task的數量即mapred.map.tasks的參數值,用戶不能直接設置這個參數。Input Split的大小,決定了一個Job擁有多少個map。默認input split的大小是64M(與dfs.block.size的默認值相同)。然而,若是輸入的數據量巨大,那麼默認的64M的block會有幾萬甚至幾十萬的Map Task,集羣的網絡傳輸會很大,最嚴重的是給Job Tracker的調度、隊列、內存都會帶來很大壓力。mapred.min.split.size這個配置項決定了每一個 Input Split的最小值,用戶能夠修改這個參數,從而改變map task的數量。
  • 一個恰當的map並行度是大約每一個節點10-100個map,且最好每一個map的執行時間至少一分鐘。
  •  reduce task的數量由mapred.reduce.tasks這個參數設定,默認值是1。
  • 合適的reduce task數量是0.95或者0.75*( nodes * mapred.tasktracker.reduce.tasks.maximum), 其中,mapred.tasktracker.tasks.reduce.maximum的數量通常設置爲各節點cpu core數量,即能同時計算的slot數量。對於0.95,當map結束時,全部的reduce可以當即啓動;對於1.75,較快的節點結束第一輪reduce後,能夠開始第二輪的reduce任務,從而提升負載均衡


 

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

相關文章
相關標籤/搜索