這篇文章主要為大家展示了“FileInputFormat如何導讀getSplits”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“FileInputFormat如何導讀getSplits”這篇文章吧。
成都創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站制作與策劃設(shè)計,梁溪網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務涵蓋:梁溪等地區(qū)。梁溪做網(wǎng)站價格咨詢:18980820575
/**
* Generate the list of files and make them into FileSplits.
* @param job the job context
* @throws IOException
*/
public List
Stopwatch sw = new Stopwatch().start();
//獲得一個InputSplit能夠包含的最小值
long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
//獲得一個InputSplit能夠包含的最大值
long maxSize = getMaxSplitSize(job);
// generate splits
List
List
/*
* 由此可知,如果有一百萬個小文件,就會循環(huán)一百萬次,并且至少生成一百萬個InputSplit,就至少含有一百萬個map任務
* 如果一個InputSplit的默認大小是一個block大小,即64M
* 一個20M的文件會產(chǎn)生一個InputSplit,一個Map任務
* 一個80M的文件會產(chǎn)生兩個InputSplit,兩個Map任務
* 兩個分別為20M的文件總共產(chǎn)生兩個InputSplit,兩個Map任務
* 一個20M、一個70M的文件總共會產(chǎn)生三個InputSplit,三個Map任務
*/
for (FileStatus file: files) {
Path path = file.getPath();
long length = file.getLen();
if (length != 0) {
BlockLocation[] blkLocations;
if (file instanceof LocatedFileStatus) {
blkLocations = ((LocatedFileStatus) file).getBlockLocations();
} else {
FileSystem fs = path.getFileSystem(job.getConfiguration());
blkLocations = fs.getFileBlockLocations(file, 0, length);
} if (isSplitable(job, path)) {
//拿到hdfs默認的block塊大小
long blockSize = file.getBlockSize();
//計算一個InputSplit的大小
long splitSize = computeSplitSize(blockSize, minSize, maxSize);
long bytesRemaining = length;
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
splits.add(makeSplit(path, length-bytesRemaining, splitSize,
blkLocations[blkIndex].getHosts(),
blkLocations[blkIndex].getCachedHosts()));
bytesRemaining -= splitSize;
}
if (bytesRemaining != 0) {
int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
splits.add(makeSplit(path, length-bytesRemaining, bytesRemaining,
blkLocations[blkIndex].getHosts(),
blkLocations[blkIndex].getCachedHosts()));
}
} else { // not splitable
splits.add(makeSplit(path, 0, length, blkLocations[0].getHosts(),
blkLocations[0].getCachedHosts()));
}
} else {
//Create empty hosts array for zero length files
splits.add(makeSplit(path, 0, length, new String[0]));
}
}
// Save the number of input files for metrics/loadgen
job.getConfiguration().setLong(NUM_INPUT_FILES, files.size());
sw.stop();
if (LOG.isDebugEnabled()) {
LOG.debug("Total # of splits generated by getSplits: " + splits.size() + ", TimeTaken: " + sw.elapsedMillis());
}
return splits;
}
以上是“FileInputFormat如何導讀getSplits”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!