轉自:https://blog.csdn.net/lb812913059/article/details/79898818
1、Map任務的個數
讀取數據產生多少個Mapper??
Mapper數據過大的話,會產生大量的小文件,過多的Mapper創建和初始化都會消耗大量的硬件資源
Mapper數太小,並發度過小,Job執行時間過長,無法充分利用分布式硬件資源
Mapper數量由什么決定??
(1)輸入文件數目(2)輸入文件的大小(3)配置參數 這三個因素決定的。
輸入的目錄中文件的數量決定多少個map會被運行起來,應用針對每一個分片運行一個map,一般而言,對於每一個輸入的文件會有一個map split。如果輸入文件太大,超過了hdfs塊的大小(128M)那么對於同一個輸入文件我們會有多余2個的map運行起來。
涉及參數:
mapreduce.input.fileinputformat.split.minsize //啟動map最小的split size大小,默認0
mapreduce.input.fileinputformat.split.maxsize //啟動map最大的split size大小,默認256M
dfs.block.size//block塊大小,默認128M
計算公式:splitSize = Math.max(minSize, Math.min(maxSize, blockSize))
下面是FileInputFormat class 的getSplits()的偽代碼:
num_splits = 0
for each input file f:
remaining = f.length
while remaining / split_size > split_slope:
num_splits += 1
remaining -= split_size
where:
split_slope = 1.1 分割斜率
split_size =~ dfs.blocksize 分割大小約等於hdfs塊大小
會有一個比例進行運算來進行切片,為了減少資源的浪費
例如一個文件大小為260M,在進行MapReduce運算時,會首先使用260M/128M,得出的結果和1.1進行比較
大於則切分出一個128M作為一個分片,剩余132M,再次除以128,得到結果為1.03,小於1.1
則將132作為一個切片,即最終260M被切分為兩個切片進行處理,而非3個切片。
2、reduce任務的個數
Reduce任務是一個數據聚合的步驟,數量默認為1。而使用過多的Reduce任務則意味着復雜的shuffle,並使輸出文件的數量激增。
一個job的ReduceTasks數量是通過mapreduce.job.reduces參數設置
也可以通過編程的方式,調用Job對象的setNumReduceTasks()方法來設置
一個節點Reduce任務數量上限由mapreduce.tasktracker.reduce.tasks.maximum設置(默認2)。
可以采用以下探試法來決定Reduce任務的合理數量:
1.每個reducer都可以在Map任務完成后立即執行:
0.95 * (節點數量 * mapreduce.tasktracker.reduce.tasks.maximum)
2.較快的節點在完成第一個Reduce任務后,馬上執行第二個:
1.75 * (節點數量 * mapreduce.tasktracker.reduce.tasks.maximum)