大數據框架MapReduce的map與reduce任務數合理設置 原

1 概述

MapReduce是一個高度抽象的大數據作業執行組件,整個作業過程主要有兩個,分別是map與reduce,本文主要介紹MapReduce中的map與reduce任務數設置的方式,以及如何合理的設置map與reduce的任務數。 

2 從源碼入手分析

(1)分析JobSubmitter 任務提交類

JobStatus submitJobInternal(Job job, Cluster cluster) {
      ......
      //計算切片數量
      int maps = writeSplits(job, submitJobDir);
      //將切片數量設置爲map任務數
      conf.setInt(MRJobConfig.NUM_MAPS, maps);
      ......
}

說明:此任務提交方法中首先通過writeSplits函數計算出切片的數量,然後將切片數量設置爲map任務數

(2)分析FileInputFormat 基於文件的輸入格式化類

public List<InputSplit> getSplits(JobContext job) {
   ......
   long splitSize = computeSplitSize(blockSize, minSize, maxSize);
   ......
}

說明:getSplits爲具體的切片算法函數

computeSplitSize函數計算出每次要切割的字節數splitSize,具體算法如下:

Math.max(minSize, Math.min(maxSize, blockSize))

算法思想爲

(1)如果maxSize小於blockSize,那麼每次就以maxSize個字節爲切割的字節數

(2)如果maxSize大於blockSize,那麼每次就以blockSize個字節爲切割的字節數

例如:輸入文件大小總共爲28個字節(回車與換行符佔2個字節),內容如下:

hello how are
thank you tom

其中maxSize = 15,minSize = 10,blockSize爲默認塊大小131072字節,計算得出每次以 15 個字節爲切割的字節數,那麼28個字節總共被分爲2片,及最終產生2個map任務。

blockSize:HDFS塊大小,以字節爲單位(Hadoop 2.0 默認塊大小爲128M)

minSize:mapreduce.input.fileinputformat.split.minsize (文件的最小切割字節數)

maxSize:mapreduce.input.fileinputformat.split.maxsize (文件的最大切割字節數)

3 自定義map任務數

通過上面的源碼分析,可以得出影響map任務數的因素主要由三個參數,blockSize、minSize、maxSize,那麼我們可以通過配置這幾個參數就可以自定義map任務數了。自定義map任務數的方式有多種

3.1 方式一:通過配置文件配置map任務數

修改mapred-site.xml文件,添加如下配置

<property>
  <name>mapreduce.input.fileinputformat.split.minsize</name>
  <value>10</value>
</property>

<property>
  <name>mapreduce.input.fileinputformat.split.maxsize</name>
  <value>15</value>
</property>

3.2 方式二:通過程序中設置map任務數

FileInputFormat.setMinInputSplitSize(job, 10);
FileInputFormat.setMaxInputSplitSize(job, 15);

4 自定義reduce任務數

通過Job的setNumReduceTasks(3) 方法來設置reduce的任務數

5 合理設置map任務數

一定數量的map任務數可以提高作業的執行速度,因爲這些map任務是完全並行處理的,那到底設置多少map任務數比較合理呢?Hadoop官方建議一般每個節點上保持10-100個map任務數,也可以根據cpu的使用率設置更高的數目,但是前提是每個map任務的執行時間需要1分鐘以上,因爲任務的啓動是需要花費一定時間的,如果map任務的執行時間小於任務的啓動時間,那麼設置了過多的map任務反而導致效率較低。

6 合理設置reduce任務數

Hadoop官方建議設置reduce任務數爲:0.95 或 1.75 * (節點數 * mapreduce.tasktracker.reduce.tasks.maximum 數)

(1)如果是乘以0.95的話,那麼在map任務執行完成後立即啓動所有的reduce任務

(2)如果是乘以1.75的話,那麼將會分兩次啓動所有的reduce任務,這樣可以更好的完成map到reduce的負載均衡

過多的reduce任務數會增加系統的開銷,從而影響整個作業的執行效率,但是卻可以更好的完成負載均衡與較低失敗的成本。

7 總結

本文主要從源碼的角度簡單分析了MapReduce的切片過程、map與reduce任務數的設置方法、以及如何正確合理的配置map與reduce任務數,如有疑問的地方請留言!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章