最近使用mapreduce處理一批數據,但要處理的文件大部分都是幾MB的小文件,當任務剛跑起來,發現啓動了不少map任務,很影響執行效率。(任務運行在cdh5.13集羣對應yarn下)負載均衡
經過配置mapreduce加載的配置文件能夠控制map的任務個數,提升執行效率。oop
mapred-site.xmlxml
<property>
<name>mapreduce.job.split.metainfo.maxsize</name>
<value>268635456</value>
</property>blog
hdfs-site.xmlit
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>效率
Map任務的個數也能經過使用JobConf 的 conf.setNumMapTasks(int num)方法來手動地設置。這個方法可以用來增長map任務的個數,可是不能設定任務的個數小於Hadoop系統經過分割輸入數據獲得的值。 集羣
Reduce任務的個數
正確的reduce任務的 個數應該是0.95或者1.75 ×(節點數 ×mapred.tasktracker.tasks.maximum參數值)。若是任務數是節點個數的0.95倍,那麼全部的reduce任務可以在 map任務的輸出傳輸結束後同時開始運行。若是任務數是節點個數的1.75倍,那麼高速的節點會在完成他們第一批reduce任務計算以後開始計算第二批 reduce任務,這樣的狀況更有利於負載均衡。 配置
Reduce任務的數量同時也控制着輸出目錄下輸出文件的數量,可是一般狀況下這並不重要,由於下一階段的 map/reduce任務會把他們分割成更加小的片斷。
Reduce任務也可以與 map任務同樣,經過設定JobConf 的conf.setNumReduceTasks(int num)方法來增長任務個數。meta