您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“如何通過(guò)inputSplit分片size控制map數(shù)目”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何通過(guò)inputSplit分片size控制map數(shù)目”吧!
前言:在具體執(zhí)行Hadoop程序的時(shí)候,我們要根據(jù)不同的情況來(lái)設(shè)置Map的個(gè)數(shù)。除了設(shè)置固定的每個(gè)節(jié)點(diǎn)上可運(yùn)行的最大map個(gè)數(shù)外,我們還需要控制真正執(zhí)行Map操作的任務(wù)個(gè)數(shù)。
1.如何控制實(shí)際運(yùn)行的map任務(wù)個(gè)數(shù)
我們知道,文件在上傳到Hdfs文件系統(tǒng)的時(shí)候,被切分成不同的Block塊(默認(rèn)大小為64MB)。但是每個(gè)Map處理的分塊有時(shí)候并不是系統(tǒng)的物理Block塊大小。實(shí)際處理的輸入分塊的大小是根據(jù)InputSplit來(lái)設(shè)定的,那么InputSplit是怎么得到的呢?
InputSplit=Math.max(minSize, Math.min(maxSize, blockSize) 其中:minSize=mapred.min.split.size maxSize=mapred.max.split.size
我們通過(guò)改變InputFormat中分片的多少來(lái)控制實(shí)際使用的Map數(shù)量,而控制InputFormat中的分片多少就需要控制每個(gè)InputSplit分片的大小
2.如何控制每個(gè)split分片的大小
Hadoop默認(rèn)的輸入格式是TextInputFormat,他里邊定義了文件讀取的方式和分片的方式。我們打開(kāi)他的源文件(org.apache.hadoop.mapreduce.lib.input包中):
package org.apache.hadoop.mapreduce.lib.input; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.CompressionCodecFactory; import org.apache.hadoop.io.compress.SplittableCompressionCodec; import org.apache.hadoop.mapreduce.InputFormat; import org.apache.hadoop.mapreduce.InputSplit; import org.apache.hadoop.mapreduce.JobContext; import org.apache.hadoop.mapreduce.RecordReader; import org.apache.hadoop.mapreduce.TaskAttemptContext; public class TextInputFormat extends FileInputFormat<LongWritable, Text> { @Override public RecordReader<LongWritable, Text> createRecordReader(InputSplit split, TaskAttemptContext context) { return new LineRecordReader(); } @Override protected boolean isSplitable(JobContext context, Path file) { CompressionCodec codec = new CompressionCodecFactory(context.getConfiguration()).getCodec(file); if (null == codec) { return true; } return codec instanceof SplittableCompressionCodec; } }
通過(guò)源代碼,我們發(fā)現(xiàn)TextInputFormat繼承了FileInputFormat,而在TextInputFormat中,我們并沒(méi)有發(fā)現(xiàn)具體的進(jìn)行文件切分的部分,TextInputFormat應(yīng)該是采用了FileInputFormat默認(rèn)的InputSplit方法。因此,我們打開(kāi)FileInputFormat的源代碼,在其中發(fā)現(xiàn):
public static void setMinInputSplitSize(Job job,long size) { job.getConfiguration().setLong("mapred.min.split.size", size); } public static long getMinSplitSize(JobContext job) { return job.getConfiguration().getLong("mapred.min.split.size", 1L); } public static void setMaxInputSplitSize(Job job,long size) { job.getConfiguration().setLong("mapred.max.split.size", size); } public static long getMaxSplitSize(JobContext context) { return context.getConfiguration().getLong("mapred.max.split.size",Long.MAX_VALUE); }
如上我們可以看到,Hadoop在這里實(shí)現(xiàn)了對(duì)mapred.min.split.size和mapred.max.split.size的定義,且默認(rèn)值分別為1和Long的最大。因此,我們?cè)诔绦蛑恍柚匦沦x值給這兩個(gè)值就可以控制InputSplit分片的大小了。
3.假如我們想要設(shè)置的分片大小為10MB
則我們可以在MapReduce程序的驅(qū)動(dòng)部分添加如下代碼:
TextInputFormat.setMinInputSplitSize(job,1024L);//設(shè)置最小分片大小 TextInputFormat.setMaxInputSplitSize(job,1024×1024×10L);//設(shè)置最大分片大小
到此,相信大家對(duì)“如何通過(guò)inputSplit分片size控制map數(shù)目”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。