這篇文章主要為大家展示了“FileInputFormat如何導讀getSplits”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“FileInputFormat如何導讀getSplits”這篇文章吧。
成都創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站制作與策劃設計,梁溪網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設10余年,網(wǎ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<InputSplit> getSplits(JobContext job) throws IOException {
Stopwatch sw = new Stopwatch().start();
//獲得一個InputSplit能夠包含的最小值
long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
//獲得一個InputSplit能夠包含的最大值
long maxSize = getMaxSplitSize(job);
// generate splits
List<InputSplit> splits = new ArrayList<InputSplit>();
List<FileStatus> files = listStatus(job);
/*
* 由此可知,如果有一百萬個小文件,就會循環(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)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當前題目:FileInputFormat如何導讀getSplits
標題網(wǎng)址:http://sd-ha.com/article0/popcoo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供、微信公眾號、網(wǎng)站收錄、服務器托管、網(wǎng)頁設計公司、網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)