因為我們的應用中處理的記錄都是固定長度的,就是說所有數據都是由固定長度的記錄構成的。這里用recordSize表示一個記錄的大小,記錄在處理處理過程中要保持完整性,所以在設置Split大小時,開始的實現代碼為:
int blockSize = Integer.parseInt(args[0]); //args[0]為輸入參數,表示用戶希望設置的Split大小 int splitSize = blockSize / recordSize * recordSize; conf.setLong("mapred.max.split.size",splitSize);
后來發現這樣做是有問題的。因為splitSize的計算公式未:
splitSize=max(minSize,min(maxSize,blockSize))
其中blockSize為文件塊大小。正確的做法如下:
int blockSize = Integer.parseInt(args[0]); //args[0]為輸入參數,表示用戶希望設置的Split大小 int splitSize = blockSize / recordSize * recordSize; conf.setLong("mapred.max.split.size",splitSize);
conf.setLong("mapred.min.split.size",splitSize);