MapReduce 之 Splits

发布时间:2026/10/25 3:12:47

MapReduce 之 Splits 参考链接https://blog.csdn.net/zhou4411781/article/details/119133431配置src/main/java/org/apache/hadoop/mapreduce/lib/input/FileInputFormat.javapublicstaticfinalString SPLIT_MAXSIZEmapreduce.input.fileinputformat.split.maxsize;publicstaticfinalString SPLIT_MINSIZEmapreduce.input.fileinputformat.split.minsize;propertynamemapreduce.input.fileinputformat.split.minsize/namevalue0/valuedescriptionThe minimum size chunk that map input should be split into.Note that some file formats may have minimum split sizes that take priority overthissetting./description/propertymapreduce.input.fileinputformat.split.maxsizesrc/main/java/org/apache/hadoop/mapreduce/lib/input/FileInputFormat.java/** * Get the maximum split size. * param context the job to look at. * return the maximum number of bytes a split can include */publicstaticlonggetMaxSplitSize(JobContext context){returncontext.getConfiguration().getLong(SPLIT_MAXSIZE,Long.MAX_VALUE);}/** * Generate the list of files and make them into FileSplits. * param job the job context * throws IOException */publicListInputSplitgetSplits(JobContext job)throws IOException{StopWatch swnewStopWatch().start();longminSizeMath.max(getFormatMinSplitSize(),getMinSplitSize(job));longmaxSizegetMaxSplitSize(job);src/main/java/org/apache/hadoop/mapred/FileInputFormat.javaif(length!0){FileSystem fspath.getFileSystem(job);BlockLocation[]blkLocations;if(file instanceof LocatedFileStatus){blkLocations((LocatedFileStatus)file).getBlockLocations();}else{blkLocationsfs.getFileBlockLocations(file,0,length);}if(isSplitable(fs,path)){longblockSizefile.getBlockSize();longsplitSizecomputeSplitSize(goalSize,minSize,blockSize);longbytesRemaininglength;while(((double)bytesRemaining)/splitSizeSPLIT_SLOP){String[][]splitHostsgetSplitHostsAndCachedHosts(blkLocations,length-bytesRemaining,splitSize,clusterMap);splits.add(makeSplit(path,length-bytesRemaining,splitSize,splitHosts[0],splitHosts[1]));bytesRemaining-splitSize;}示例2026-01-0815:26:46,125INFO mapred.FileInputFormat:Total input files to process:2562026-01-0815:26:46,157INFO mapreduce.JobSubmitter:number of splits:256Debugsrc/main/java/org/apache/hadoop/mapreduce/JobSubmitter.java//method to write splits for old api mapper.privateintwriteOldSplits(JobConf job,Path jobSubmitDir)throws IOException{org.apache.hadoop.mapred.InputSplit[]splitsjob.getInputFormat().getSplits(job,job.getNumMapTasks());// sort the splits into order based on size, so that the biggest// go firstArrays.sort(splits,newComparatororg.apache.hadoop.mapred.InputSplit(){publicintcompare(org.apache.hadoop.mapred.InputSplit a,org.apache.hadoop.mapred.InputSplit b){//method to write splits for old api mapper.privateintwriteOldSplits(JobConf job,Path jobSubmitDir)throws IOException{org.apache.hadoop.mapred.InputSplit[]splitsjob.getInputFormat().getSplits(job,job.getNumMapTasks());// sort the splits into order based on size, so that the biggest// go firstArrays.sort(splits,newComparatororg.apache.hadoop.mapred.InputSplit(){publicintcompare(org.apache.hadoop.mapred.InputSplit a,org.apache.hadoop.mapred.InputSplit b){try{wordcount debugsrc/main/java/org/apache/hadoop/examples/WordCount.javajob.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);for(inti0;iotherArgs.length-1;i){FileInputFormat.addInputPath(job,newPath(otherArgs[i]));}FileOutputFormat.setOutputPath(job,newPath(otherArgs[otherArgs.length-1]));System.exit(job.waitForCompletion(true)?0:1);importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;这些属于 new apiold api 如下importorg.apache.hadoop.mapred.FileInputFormat;importorg.apache.hadoop.mapred.FileOutputFormat;importorg.apache.hadoop.mapred.JobClient;importorg.apache.hadoop.mapred.JobConf;importorg.apache.hadoop.mapred.Mapper;importorg.apache.hadoop.mapred.OutputCollector;importorg.apache.hadoop.mapred.Reporter;importorg.apache.hadoop.mapred.SequenceFileInputFormat;waitForCompletionsrc/main/java/org/apache/hadoop/mapreduce/Job.java/** * Submit the job to the cluster and wait for it to finish. * param verbose print the progress to the user * return true if the job succeeded * throws IOException thrown if the communication with the * codeJobTracker/code is lost */publicbooleanwaitForCompletion(boolean verbose)throws IOException,InterruptedException,ClassNotFoundException{if(stateJobState.DEFINE){submit();}/** * Submit the job to the cluster and return immediately. * throws IOException */publicvoidsubmit()throws IOException,InterruptedException,ClassNotFoundException{ensureState(JobState.DEFINE);setUseNewAPI();connect();/** * Default to the new APIs unless they are explicitly set or the old mapper or * reduce attributes are used. * throws IOException if the configuration is inconsistent */privatevoidsetUseNewAPI()throws IOException{intnumReducesconf.getNumReduceTasks();String oldMapperClassmapred.mapper.class;String oldReduceClassmapred.reducer.class;conf.setBooleanIfUnset(mapred.mapper.new-api,conf.get(oldMapperClass)null);if(conf.getUseNewMapper()){String modenew map API;src/main/java/org/apache/hadoop/mapreduce/JobSubmitter.javaprivateT extends InputSplitintwriteNewSplits(JobContext job,Path jobSubmitDir)throws IOException,InterruptedException,ClassNotFoundException{Configuration confjob.getConfiguration();InputFormat?,?inputReflectionUtils.newInstance(job.getInputFormatClass(),conf);ListInputSplitsplitsinput.getSplits(job);publicListInputSplitgetSplits(JobContext job)throws IOException{longminSizeNode0;longminSizeRack0;longmaxSize0;Configuration confjob.getConfiguration();// the values specified by setxxxSplitSize() takes precedence over the// values that might have been specified in the configif(minSplitSizeNode!0){minSizeNodeminSplitSizeNode;}else{minSizeNodeconf.getLong(SPLIT_MINSIZE_PERNODE,0);}src/main/java/org/apache/hadoop/mapreduce/lib/input/CombineFileInputFormat.javapublicListInputSplitgetSplits(JobContext job)throws IOException{longminSizeNode0;longminSizeRack0;longmaxSize0;Configuration confjob.getConfiguration();// the values specified by setxxxSplitSize() takes precedence over the// values that might have been specified in the configif(minSplitSizeNode!0){minSizeNodeminSplitSizeNode;}else{minSizeNodeconf.getLong(SPLIT_MINSIZE_PERNODE,0);}if(minSplitSizeRack!0){minSizeRackminSplitSizeRack;}else{minSizeRackconf.getLong(SPLIT_MINSIZE_PERRACK,0);}if(maxSplitSize!0){maxSizemaxSplitSize;}else{maxSizeconf.getLong(mapreduce.input.fileinputformat.split.maxsize,0);// If maxSize is not configured, a single split will be generated per// node.}// create splits for all files that are not in any pool.getMoreSplits(job,stats,maxSize,minSizeNode,minSizeRack,splits);// free up rackToNodes maprackToNodes.clear();returnsplits;}/** * Return all the splits in the specified set of paths */privatevoidgetMoreSplits(JobContext job,ListFileStatusstats,longmaxSize,longminSizeNode,longminSizeRack,ListInputSplitsplits)throws IOException{Configuration confjob.getConfiguration();// all blocks for all the files in input setOneFileInfo[]files;// mapping from a rack name to the list of blocks it hasHashMapString,ListOneBlockInforackToBlocksnewHashMapString,ListOneBlockInfo();// mapping from a block to the nodes on which it has replicasHashMapOneBlockInfo,String[]blockToNodesnewHashMapOneBlockInfo,String[]();// mapping from a node to the list of blocks that it containsHashMapString,SetOneBlockInfonodeToBlocksnewHashMapString,SetOneBlockInfo();filesnewOneFileInfo[stats.size()];if(stats.size()0){return;}// populate all the blocks for all fileslongtotLength0;inti0;for(FileStatus stat:stats){files[i]newOneFileInfo(stat,conf,isSplitable(job,stat.getPath()),rackToBlocks,blockToNodes,nodeToBlocks,rackToNodes,maxSize);totLengthfiles[i].getLength();}createSplits(nodeToBlocks,blockToNodes,rackToBlocks,totLength,maxSize,minSizeNode,minSizeRack,splits);}split 相关截图两种合并策略echo 第 $i 次运行 $(date %Y-%m-%d %H:%M:%S)result-1536f-128m-am200-180m-128r.txt/usr/bin/time-p-a-o result-teragen.txt hadoop jar/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar teragen-Dmapreduce.job.maps1536-Ddfs.blocksize128M16106127360/terasort/terasort-input sleep100#sshhadoop01echo 3 /proc/sys/vm/drop_caches#sshhadoop02echo 3 /proc/sys/vm/drop_caches#sshhadoop03echo 3 /proc/sys/vm/drop_caches#sleep50# 排序/usr/bin/time-p-a-o result-1536f-128m-am200-180m-128r.txt hadoop jar/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar terasort \-Dmapreduce.task.io.sort.mb1280\-Dmapreduce.map.memory.mb3100\-Dmapreduce.reduce.memory.mb4375\-Dmapreduce.input.fileinputformat.split.minsize1073741824\-Dyarn.app.mapreduce.am.scheduler.heartbeat.interval-ms200\-Dmapreduce.job.reduces1170\-Dmapreduce.map.java.opts-noverify -XX:UseSerialGC -XX:MetaspaceSize64m -XX:CompileThreshold500 -XX:CICompilerCount2 -Djava.net.preferIPv4Stacktrue -Xmn1024m -Xms1536m -Xmx1536m -XX:UseTransparentHugePages\-Dmapreduce.reduce.java.opts-noverify -XX:UseSerialGC -XX:MetaspaceSize64m -XX:CompileThreshold500 -XX:CICompilerCount2 -Djava.net.preferIPv4Stacktrue -Xmn1024m -Xms1536m -Xmx1536m -XX:UseTransparentHugePages\/terasort/terasort-input/terasort/terasort-outputnohup-sort-1.5t-$i.txt21#TestDFSIO-D mapred.input.format.classorg.apache.hadoop.mapred.lib.CombineSequenceFileInputFormat \-D mapred.max.split.size1120#Terasort-Dmapreduce.input.fileinputformat.split.minsize1073741824\Terasort 合并的是同一个文件里的多个 blockTestDFSIO 合并的是多个独立小文件——前者 FileInputFormat (mapreduce.input.fileinputformat.split.minsize1073741824 )支持后者它根本做不到。
延伸阅读

更多相关文章

2026/10/24 1:52:56

从零实现日地轨道计算:开普勒方程与儒略日实战

1. 从"抬头看天"到"动手算轨道":这个项目到底在做什么"地球围绕太阳转"这句话,大概是我们从小到大听过最多的一句天文常识。但真要把它从一句口号变成一个能跑起来、能算出具体位置的计算模型,中间隔着的可不止…

2026/10/25 4:08:05

中国车企智能驾驶技术突破与行业变革分析

1. 智能驾驶测试背后的行业格局变迁最近一份来自美国的智能驾驶测试报告在业内引发热议,测试结果显示三家中国车企表现优异,而部分传统强势车企却意外落马。这个结果看似简单,实则折射出全球汽车产业正在经历的重大变革。智能驾驶测试通常包含…

2026/10/25 4:08:05

Kafka批量修改分区与副本:AdminClient代码实战与避坑指南

Kafka 集群跑久了,几乎每个运维或后端开发都会撞上同一个尴尬局面:当初建 topic 时随手给了 3 分区 2 副本,业务量一上来,消费者数量扩到 8 个,结果一半在空转;或者集群扩容加了 broker,老 topi…

2026/10/25 4:08:05

智能交通强化学习泛化难题:从场景指纹到通用策略的重构实践

上个月复盘一套智能路口信号控制项目时,统计到一件让人很尴尬的事:在A路口训练收敛的强化学习模型,平移到一条相隔不到两公里、车道布局几乎一样、流量只差15%的B路口后,平均延误不降反升了12%。团队成员开玩笑说“这模型可能只认…

2026/10/25 4:08:05

算法与工程如何拧成一股绳:AI落地中的软硬结合实战

1. 从“DS和华为”这个标题说起:我到底想聊什么“DS和华为”这个标题,第一次看到的时候,我脑子里蹦出来的不是某个具体产品,而是一组关系:一个是以算法和模型能力见长的技术流派,一个是以硬件工程和系统整合…

2026/10/25 4:08:05

目标检测论文周报:开放词汇、小目标与Transformer检测器精读

1. 一周论文速览的整理思路与筛选逻辑每周固定花半天时间刷目标检测方向的新论文,是我做了快三年的习惯。这周(0927-1003)的整理工作照例从几个预印本平台的更新列表开始,最终筛出12篇值得细读的工作,其中5篇做了完整精…

2026/10/25 4:03:05

基于PyTorch的狗表情识别系统开发实战

1. 项目概述:当AI遇上狗表情去年帮朋友训练宠物狗时,我注意到一个有趣现象:当狗竖起耳朵时往往表示警觉,而耳朵后贴通常代表恐惧。这让我萌生了用AI识别狗表情的想法。本项目正是基于深度学习的狗表情识别系统,使用Pyt…

2026/10/25 0:02:22

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/25 0:02:23

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/25 0:02:23

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/25 0:02:22

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/25 0:02:23

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/25 0:02:23

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑