2017-03-16 65 views
1

我有一個大小爲39MB的文件,我將塊大小設置爲36MB。當文件上傳到HDFS時,它將文件成功存儲在兩個塊中。現在,當我運行一個Map-Reduce作業此文件(簡單的讀取作業),作業計數器顯示: 「信息mapreduce.JobSubmitter:拆分的數量:1創建輸入分割(HADOOP)

也就是說,它正在考慮2塊作爲一個單一的分割,所以我環顧四周,發現下式用於計算所述分割尺寸,該尺寸如下:

分割尺寸= MAX(最小尺寸,分鐘(MAXSIZE,塊大小))

其中minsize = mapreduce.input.fileinputformat.split.minsizemaxsize = minsize = mapreduce.input.fileinputformat.split.maxsize

現在在我的MR代碼我設置以下屬性:

Configuration conf = new Configuration() 
conf.set("mapreduce.input.fileinputformat.split.minsize","1") 
conf.set("mapreduce.input.fileinputformat.split.maxsize","134217728") 

即MINSIZE = 1個字節和MAXSIZE = 128 MB,所以根據下式分割大小應該是36MB,因此兩個裂口應在那裏,但我仍得到相同的計數器輸出爲:

信息mapreduce.JobSubmitter:拆分的數量:1

任何人都可以解釋,爲什麼?

+0

它是什麼類型的文件? –

+0

這是一個.csv文件@BinaryNerd – User9523

回答

1

文件的最後一個分割可能會溢出10%。 這稱爲SPLIT_SLOP,它設置爲1.1

在這種情況下,

39MB (Remaining Bytes)/36MB (Input Split Size) = 1.08 is less than 1.1 (SPLIT_SLOP) 

因此整個文件被認爲是一個分裂。

片段分割上如何劃分,

long bytesRemaining = FileSize; 
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) { 
    String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations,length-bytesRemaining, splitSize, clusterMap); 
    splits.add(makeSplit(path, length-bytesRemaining, splitSize,splitHosts[0], splitHosts[1])); 
    bytesRemaining -= splitSize; 
} 

參考getSplits()方法知道的分裂是如何爲每個文件分割。

+0

這(剩餘字節數)是總文件大小? – User9523

+1

在這種情況下,由於文件大小很小,因此整個文件看起來像剩餘的字節。例如:如果Filse大小爲75MB,那麼你將有2個分割。第一次分割將是'36MB',第二次分割將是'39MB'。剩餘字節爲每個拆分部分改變。請參閱更新的答案 – franklinsijo

+0

我們可以覆蓋SPLIT_SLOP的值嗎?最重要的是,我們應該超越這個價值嗎? – User9523

相關問題