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任務數,如有疑問的地方請留言!