map和reduce 個數的設定

原文連接:http://blog.csdn.net/aaa1117a8w5s6d/article/details/33781319node

  • map task的數量即mapred.map.tasks的參數值,用戶不能直接設置這個參數。Input Split的大小,決定了一個Job擁有多少個map。默認input split的大小是128M(與dfs.block.size的默認值相同)。然而,若是輸入的數據量巨大,那麼默認的128M的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或者1.75*( nodes * mapred.tasktracker.reduce.tasks.maximum), mapred.tasktracker.tasks.reduce.maximum的數量通常設置爲各節點cpu core數量,即能同時計算的slot數量。對於0.95,當map結束時,全部的reduce可以當即啓動;對於1.75,較快的節點結束第一輪reduce後,能夠開始第二輪的reduce任務,從而提升負載均衡。

 

 

  • 對一 個job的map數和reduce數的設定對一個job的運行是很是重要的,而且很是簡單。如下是一些設 置這幾個值的經驗總結:網絡

    • 若是job的每一個map或者 reduce task的運行時間都只有30-40秒鐘,那麼就減小該job的map或者reduce數,每個task(map|reduce)的setup和加入到 調度器中進行調度,這個中間的過程可能都要花費幾秒鐘,因此若是每一個task都很是快就跑完了,就會在task的開始和結束的時候浪費太多的時間。JVM 的reuse方式也能夠解決 這個問題。
    • 如 果某個input的文件 很是的大,好比 1TB,能夠考慮將hdfs上的每一個block size設大,好比設成256MB或者512MB,這樣map和reduce的數據 能夠減少。並且用戶還能夠經過命令 hadoop distcp -Ddfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks的方式來將已經存在咋hdfs上的數據進行大塊化。而後刪除掉原先的文件。
    • 只 要每一個task都運行至少30-40秒鐘,就能夠考慮將mapper數擴大,好比集羣的map slots爲100個,那麼就不要將一個job的mapper設成101,這樣前100個map可以並行完成,而最後一個map要在前100個 mapper結束後纔開始,所以在reduce開始運行前,map階段的時間幾乎就要翻倍。
    • 儘可能不要運行太多的reduce task。對大多數job來講,最好rduce的個數最多和集羣中的reduce持平,或者比集羣的 reduce slots小。這個對於小集羣而言,尤爲重要。

------------------------------------------------------------------------------------------------------------------併發

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

相關文章
相關標籤/搜索