MapReduce中map任務個數的確定
在map階段讀取資料前,FileInputFormat會將輸入檔案分割成split。split的個數決定了
map的個數。
影響map個數,即split個數的因素主要有:
1)HDFS塊的大小,即HDFS中dfs.block.size的值。如果有一個輸入檔案為1024m,當塊為
256m時,會被劃分為4個split;當塊為128m時,會被劃分為8個split。
2)檔案的大小。當塊為128m時,如果輸入檔案為128m,會被劃分為1個split;當塊為256m,
會被劃分為2個split。
3)檔案的個數。FileInputFormat按照檔案分割split,並且只會分割大檔案,即那些大小超過
HDFS塊的大小的檔案。如果HDFS中dfs.block.size設定為64m,而輸入的目錄中檔案有100個,則
劃分後的split個數至少為100個。
4)splitsize的大小。分片是按照splitszie的大小進行分割的,一個split的大小在沒有設定的情況下,
預設等於hdfs block的大小。但應用程式可以通過兩個引數來對splitsize進行調節。
map個數的計算公式如下:
1,splitsize=max(minimumsize,min(maximumsize,blocksize))。如果沒有設定minimumsize和maximumsize
,splitsize的大小預設等於blocksize
2,計算公式
計算過程可以簡化為如下的公式,詳細演算法可以參照FileInputSplit類中的getSplits方法
total_split ;
for(file :輸入目錄中的每個檔案)
{
file_split = 1;
if(file.size>splitsize)
{
file_split=file_size/splitsize;
}
total_split+=file_split;
}