日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

考究Hadoop中split的计算方法

發(fā)布時(shí)間:2024/1/17 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 考究Hadoop中split的计算方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Hadoop中block塊大小和split切片大小會(huì)影響到MapReduce程序在運(yùn)行過(guò)程中的效率、map的個(gè)數(shù)。在本文中,以經(jīng)典入門(mén)案例WordCount為例,通過(guò)debug的方式跟蹤源代碼,來(lái)分析hadoop中split的計(jì)算方法。

前期準(zhǔn)備

wc.txt的準(zhǔn)備?
單詞統(tǒng)計(jì),以空格為分割符對(duì)單詞進(jìn)行切割。因此wc.txt中的單詞都以空格進(jìn)行分割?
mr核心部分介紹?
map?
提取每一行,String[] arr = line.split(” “);

for(String word : arr){context.write(new Text(word),new IntWritable(1)); }

reduce?
對(duì)每一個(gè)key的個(gè)數(shù)進(jìn)行迭代,計(jì)算總數(shù)。

修改HDFS的文件塊大小

hdfs-default.xml?
首先查看默認(rèn)的配置信息?
文件塊的大小

<property><name>dfs.blocksize</name><value>134217728</value><description>The default block size for new files, in bytes.You can use the following suffix (case insensitive):k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.),Or provide complete size in bytes (such as 134217728 for 128 MB).</description> </property>

最小文件塊的大小

<property><name>dfs.namenode.fs-limits.min-block-size</name><value>1048576</value><description>Minimum block size in bytes, enforced by the Namenode at createtime. This prevents the accidental creation of files with tiny blocksizes (and thus many blocks), which can degradeperformance.</description> </property>

hdfs-site.xml?
了解默認(rèn)的配置信息之后,對(duì)其進(jìn)行修改

<property><name>dfs.blocksize</name><value>512</value> //塊大小需要能夠整除校驗(yàn)和 需要符合校驗(yàn)和的倍數(shù)要求(切記!!必須為512的倍數(shù)) </property> <property><name>dfs.namenode.fs-limits.min-block-size</name><value>10</value> </property>

通過(guò)命令行查看屬性是否修改成功

$>hdfs getconf -confKey dfs.blocksize $>hdfs getconf -confKey dfs.namenode.fs-limits.min-block-size

關(guān)鍵部分源碼解析

對(duì)所涉及到的關(guān)鍵部分,進(jìn)行解析?
org.apache.hadoop.mapreduce.JobSubmitter類

private int writeSplits(org.apache.hadoop.mapreduce.JobContext job,Path jobSubmitDir) throws IOException,InterruptedException, ClassNotFoundException {// 得到配置信息JobConf jConf = (JobConf)job.getConfiguration();int maps;// 判斷是否是新的Mapperif (jConf.getUseNewMapper()) {// 計(jì)算新的切片信息// 作業(yè) job: com.sun.jdi.InvocationException occurred invoking method.// 作業(yè)提交目錄 jobSubmitDir: /tmp/hadoop-yarn/staging/zhaotao/.staging/job_1496761683234_0001maps = writeNewSplits(job, jobSubmitDir);} else {maps = writeOldSplits(jConf, jobSubmitDir);}return maps;}...private <T extends InputSplit>int writeNewSplits(JobContext job, Path jobSubmitDir) throws IOException,InterruptedException, ClassNotFoundException {// 得到配置信息Configuration conf = job.getConfiguration();// 得到輸入格式InputFormat<?, ?> input =ReflectionUtils.newInstance(job.getInputFormatClass(), conf);// 得到splits切片的集合,具體的值為:// [hdfs://s100/data/wc.txt:0+150, hdfs://s100/data/wc.txt:150+150, hdfs://s100/data/wc.txt:300+150, hdfs://s100/data/wc.txt:450+150, hdfs://s100/data/wc.txt:600+158]總共切了5個(gè)List<InputSplit> splits = input.getSplits(job);T[] array = (T[]) splits.toArray(new InputSplit[splits.size()]);// sort the splits into order based on size, so that the biggest// go firstArrays.sort(array, new SplitComparator());JobSplitWriter.createSplitFiles(jobSubmitDir, conf, jobSubmitDir.getFileSystem(conf), array);return array.length;}

org.apache.hadoop.mapreduce.lib.input.FileInputFormat類

public List<InputSplit> getSplits(JobContext job) throws IOException {StopWatch sw = new StopWatch().start();// 通過(guò)getFormatMinSplitSize()方法 取得最小切片的大小為一個(gè)固定值(可通過(guò)配置文件配置得到)為0// 通過(guò)getMinSplitSize()方法 得到最小切片值為1// minSize的值為1long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));// maxSize的值為:9223372036854775807long maxSize = getMaxSplitSize(job);// generate splits// 創(chuàng)建一個(gè)集合List<InputSplit> splits = new ArrayList<InputSplit>();// 得到hdfs的文件夾列表List<FileStatus> files = listStatus(job);// 得到每個(gè)文件的狀態(tài),進(jìn)行for循環(huán)for (FileStatus file: files) {// 取到文件的路徑Path path = file.getPath();// 取到文件的長(zhǎng)度long length = file.getLen();if (length != 0) {// 文件塊位置的數(shù)組BlockLocation[] blkLocations;if (file instanceof LocatedFileStatus) {// 通過(guò)getBlockLocations()方法得到文件塊的位置// blkLocations的值:[0,512,s103,s101,s104, 512,246,s103,s104,s102] 為兩塊文件塊blkLocations = ((LocatedFileStatus) file).getBlockLocations();} else {FileSystem fs = path.getFileSystem(job.getConfiguration());blkLocations = fs.getFileBlockLocations(file, 0, length);}// 判斷文本文件是否可切割if (isSplitable(job, path)) {// 得到塊大小// blockSize的值為512// 切片大小與塊大小、最小切片值、最大切片值有關(guān)long blockSize = file.getBlockSize();// 計(jì)算切片大小// blockSize=512;minSize=1;maxSize=9223372036854775807// splitSize的值為512long splitSize = computeSplitSize(blockSize, minSize, maxSize);...// 最終返回的值為一個(gè)切片集合// 具體的值為:[hdfs://s100/data/wc.txt:0+150, hdfs://s100/data/wc.txt:150+150, hdfs://s100/data/wc.txt:300+150, hdfs://s100/data/wc.txt:450+150, hdfs://s100/data/wc.txt:600+158]總共切了5個(gè)return splits;...// 得到切片大小的一個(gè)下限值,返回的是一個(gè)最小切片的字節(jié)數(shù)protected long getFormatMinSplitSize() {return 1;}...public static long getMinSplitSize(JobContext job) {// SPLIT_MINSIZE = mapreduce.input.fileinputformat.split.minsize(該配置項(xiàng)的默認(rèn)值為0)// job.getConfiguration().getLong(SPLIT_MINSIZE, 1L) = 0return job.getConfiguration().getLong(SPLIT_MINSIZE, 1L);}...public static long getMaxSplitSize(JobContext context) {// SPLIT_MAXSIZE = mapreduce.input.fileinputformat.split.maxsize// Long.MAX_VALUE的意思為取長(zhǎng)整型的最大值9223372036854775807// context.getConfiguration().getLong(SPLIT_MAXSIZE,Long.MAX_VALUE)的值為9223372036854775807return context.getConfiguration().getLong(SPLIT_MAXSIZE, Long.MAX_VALUE);}...protected long computeSplitSize(long blockSize, long minSize,long maxSize) {// 先在maxSize與blockSize之間選擇小的,再使用該值與minSize之間取得大的值// 就是取了三個(gè)值之間的中間值return Math.max(minSize, Math.min(maxSize, blockSize));}

split計(jì)算方法

通過(guò)對(duì)源代碼的跟蹤,將split的計(jì)算方法總結(jié)如下:?
minSize = 1(默認(rèn)) (屬性名字:mapreduce.input.fileinputformat.split.minsize)?
maxSize = Long.MAX_VALUE(默認(rèn)) (屬性名字:mapreduce.input.fileinputformat.split.maxsize)?
blockSize = 512 (屬性名字:dfs.blocksize=128mb默認(rèn)值)?
計(jì)算方法:max(minSize,min(blockSize,maxSize))?
根據(jù)上述數(shù)據(jù),所以該過(guò)程中的切片大小為512

總結(jié)

以上是生活随笔為你收集整理的考究Hadoop中split的计算方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。